Scala Akka群集检测隔离状态

Scala Akka群集检测隔离状态,scala,akka,akka-cluster,Scala,Akka,Akka Cluster,如何从正在隔离的系统中检测隔离状态~ 我看到下面的日志: [warn]远程处理-尝试与无法访问的远程地址[akka]关联。tcp://Application@192.168.0.15:6000]. 该地址现在被选通5000毫秒,所有发送到该地址的消息将以死信的形式发送。原因:远程系统已隔离此系统。在重新启动此系统之前,无法与远程系统建立进一步的关联。 但我不确定如何从代码中对此做出反应 我发现了以下线程:,建议侦听隔离事件,但该事件未在被隔离的系统上调度 实际上,我听了所有的RemotingL

如何从正在隔离的系统中检测隔离状态~

我看到下面的日志:

[warn]远程处理-尝试与无法访问的远程地址[akka]关联。tcp://Application@192.168.0.15:6000]. 该地址现在被选通5000毫秒,所有发送到该地址的消息将以死信的形式发送。原因:远程系统已隔离此系统。在重新启动此系统之前,无法与远程系统建立进一步的关联。

但我不确定如何从代码中对此做出反应


我发现了以下线程:,建议侦听
隔离事件
,但该事件未在被隔离的系统上调度

实际上,我听了所有的
RemotingLifecycleEvent
s,发现:

AssociationError[akka。tcp://Application@192.168.0.100:2552]->[akka。tcp://Application@192.168.0.15:6000]:错误[无效地址:akka。tcp://Application@192.168.0.15:6000][akka.remote.InvalidAssociation:无效地址:akka。tcp://Application@192.168.0.15:6000
原因:akka.remote.transport.transport$InvalidAssociationException:远程系统已隔离此系统。在重新启动此系统之前,无法与远程系统建立进一步的关联。]


但这只是一个
关联错误
,由于许多其他原因也将被发送,我是否必须搜索实际文本
“远程系统已隔离此系统。”
在错误中以确保???

是的,您建议的工作正常,可以按如下方式执行

向akka.remote.AssociationErrorEvent订阅一个参与者

override def preStart(): Unit = {
  context.system.eventStream.subscribe(self, classOf[akka.remote.AssociationErrorEvent])
}
然后在
receive
方法中执行以下操作

override def receive: Receive = {
  case e:AssociationErrorEvent =>
    log.info(s"AssociationErrorEvent: $e")
    if (e.cause.getCause.getMessage.contains("quarantined this system")) {
      log.warning(s"We got quarantined")
    }
}

威廉·卡特评论如下:

Akka提供了不需要检查消息内容的适当事件

class MyActor extends Actor with ActorLogging {

  override def preStart(): Unit = {
    super.preStart()
    context.system.eventStream.subscribe(context.self, classOf[ThisActorSystemQuarantinedEvent])
  }

  override def receive: Receive = {
    case ev: ThisActorSystemQuarantinedEvent => log.warning(s"I was quarantined by ${ev.remoteAddress}")
  }
}

在flink对akka的使用中,您会发现它与实际文本相匹配,以确定它是否被隔离。从2.4.2开始,就有了
ThisActorSystemQuarantinedEvent
()。