Akka/scala-OversizedPayloadException 如何处理?

Akka/scala-OversizedPayloadException How to handel it?

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

2016-08-10 23:08:29,737 [EndpointWriter] ERROR - Transient association error (association remains live) akka.remote.OversizedPayloadException: Discarding oversized payload sent to Actor[akka.tcp://abcd@127.0.0.1:51665/temp/$b]: max allowed size 128000 bytes, actual size of encoded class common.data.model.configuration.UserList was 571444 bytes.

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

尝试订阅事件流。希望例外会到此为止:

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 邮件组发布了相同的查询。他们说没有处理这个 "OversizedPayloadException" 的选项。你建议我们在 return 给演员之前检查数据大小并处理它。

其实我们可以处理的,只需要订阅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])