java - 如何知道一个 Actor 是否存在于 Actor 系统中

标签 java scala akka actor

嗨,我想在 Actor 系统中创建一个 Actor ,如果它还没有创建,这里是我的代码

val sel = actorSystem.actorSelection("akka://ActorSystem/user/ReadOnlyAdminIndexMongoActor");
val asker = new AskableActorSelection(sel);

val future = asker.ask( Identify(1),Timeout(30 seconds))
val identity=Await.result(future, timeout.duration).asInstanceOf[ActorIdentity]         

val reference = identity.getRef
if(reference != null){
     log.info("actor does not exists")
   }
   else
   {
     log.info("actor exists"+sel.toString())
   }

但是这段代码抛出异常

17:00:19.547 1822010 [ArteciateActorSystem-akka.actor.default-dispatcher-7] EmptyLocalActorRef INFO - Message [scala.Tuple2] from Actor[akka://ActorSystem/temp/$e] to Actor[akka://ActorSystem/user/ReadOnlyAdminIndexMongoActor] was not delivered. [5] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
java.util.concurrent.TimeoutException: Futures timed out after [30 seconds]
    at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
    at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
    at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:190)
    at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
    at scala.concurrent.Await$.result(package.scala:190)
    at models.Global$.checkActor(Global.scala:71)

这是第 71 行的代码

val identity=Await.result(future, timeout.duration).asInstanceOf[ActorIdentity]   

请帮助我,我错了,而且我正在使用此代码 Link还有这个Link the code givein in an accepted answer

最佳答案

使用Identify是确定 Actor 是否存在的正确方法。收到请求超时通常表明它没有超时,因为那里没有参与者响应。我说通常是因为消息流量负载和/或远程处理可能会因其他原因导致超时。

我的问题是,既然你有一个众所周知的地址,那么在什么情况下这个 Actor 可能不存在?您只是想按需懒惰地创建它,还是试图从 Actor 的崩溃中恢复?

对于这两种情况,我建议采用代理模式,即在众所周知的地址上有一个简单的、防崩溃的(由于其简单性)actor,它负责创建 ReadOnlyAdminIndexMongoActor按需并向其代理消息。该代理也将是主管,在崩溃时恢复参与者。如果有意义的话,它甚至允许您使 ReadOnlyAdminIndexMongoActor 空闲超时,因为每个人都将始终通过代理与它交谈。

此代理的简单实现(没有主管或空闲超时处理)可能如下所示:

class OnDemandProxyActor(proxyProps: Props) extends Actor {

  def receive = waiting()

  def waiting: Receive = {
    case msg =>
       val target = context.actorOf(proxyProps)
       target forward msg
       context.become(proxying(target))
  }

  def proxying(target: ActorRef): Receive = {
    case msg => target forward msg
  }
}

其中 proxyProps 是用于按需创建 Actor 的 Propswaiting 是未收到消息的初始状态,因此proxy target 尚未创建,proxying 是创建 target 后的状态。两种状态都使用forward将收到的消息发送到目标,就好像它来自原始发送者

关于java - 如何知道一个 Actor 是否存在于 Actor 系统中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510898/

相关文章:

scala - 在 Akka Typed 中向父actor发送消息

scala - Spark - Scala : shuffle RDD/split RDD into two random parts randomly

scala - 将元组添加到集合中不起作用

Scala pipelines - 用于构建 DAG 工作流程的 DSL

java - 如何在 JSP 中通过 URL 传递对象?

scala - 获取SettingKey [T]的值

java - 玩2.5升级报错: CompletionException - There is no HTTP Context available from here

java - MigLayout:如何*垂直*对齐扩展坞内的多个组件?

java - 由于以下问题无法启动服务器 : Launch process failed with exit code 1

java - 滚动多行 EditText 时移除焦点