【问题标题】:Akka/scala-OversizedPayloadException How to handel it?Akka/scala-Oversized Payload Exception 如何处理?
【发布时间】:2016-12-16 15:45:57
【问题描述】:

我们在 akka 集群上有一个分布式应用程序。演员“A”向远程演员发送大尺寸消息。我们收到以下警告:

2016-08-10 23:08:29,737 [EndpointWriter] 错误 - 瞬态关联 错误(关联仍然有效) akka.remote.OversizedPayloadException:丢弃过大的有效负载 发送到 Actor[akka.tcp://abcd@127.0.0.1:51665/temp/$b]: max allowed 大小 128000 字节,编码类的实际大小 common.data.model.configuration.UserList 为 571444 字节。

我们知道我们可以增加configuration 中的值。但是我们想检查大小是否超过了我们想要发送不同消息的默认限制。尝试搜索但没有运气,他们中的大多数只告诉如何配置它没有人谈论如何处理它并向远程机器发送消息。任何建议或帮助将不胜感激。

【问题讨论】:

    标签: scala playframework playframework-2.0 akka-http akka-cluster


    【解决方案1】:

    向 Akka 邮件组发布了相同的查询。他们说没有处理这个“OversizedPayloadException”的选项。您建议我们在返回给参与者之前检查数据大小并处理它。

    【讨论】:

    • 我正在尝试检查我作为 clustermessage 的一部分发送的 json 大小,但是,在我的消息大小非常接近限制集(但仍然更小)的边界情况下,它会抛出一个错误,表示它正在进一步编码消息并由于某些编码而增加其大小。你能帮我如何获取正在发送的编码消息的大小吗?
    【解决方案2】:

    其实我们是可以处理的,只需要订阅akka.event.Logging.Error,看看是不是OversizedPayloadException的原因:

    import akka.actor.{Actor, Props}
    
    class Listener extends Actor {
      override def receive: Receive = {
        case akka.event.Logging.Error(cause, _, _, _)
          // this internal Akka class is package-private, hence we have to check it's classname :(
          if cause.getClass.getName == "akka.remote.OversizedPayloadException" =>
          // handle it here!
      }
    }
    
    val listener = system.actorOf(Props(new Listener))
    system.eventStream.subscribe(listener, classOf[akka.event.Logging.Error])
    

    【讨论】:

    • 太棒了...会尝试使用它。谢谢。
    【解决方案3】:

    尝试订阅事件流。希望异常会在那里结束:

    import akka.actor.{Actor, Props}
    import akka.remote.OversizedPayloadException
    
    class Listener extends Actor {
      def receive = {
        case d: OversizedPayloadException  => {
            // DO SOMETHING
        }
      }
    }
    val listener = system.actorOf(Props(classOf[Listener], this))
    system.eventStream.subscribe(listener, classOf[OversizedPayloadException])
    

    更多信息here

    【讨论】:

    • 当我尝试执行上述操作时,我收到错误“无法在包 akka.remote 中访问包远程中的类 OversizedPayloadException”。我确信我犯了一些基本的错误。你能指导我吗?
    • 我得到这个异常的任何原因?
    • @Prakash 您无法访问它,因为 OversizedPayloadException 在 akka.remote 包中是私有的。 p.s.我知道,这对你来说可能为时已晚,但对其他人来说可能不是...... :)
    • @EvgenyVeretennikov 是的,没错。我现在知道了。请参考下面的答案。
    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多