当前位置:  开发笔记 > 编程语言 > 正文

在Akka消息中发送期货好吗?

如何解决《在Akka消息中发送期货好吗?》经验,为你挑选了1个好方法。

我正在努力实现一种小语言来将任务发送到执行和控制执行流程.在将任务发送到我的系统之后,用户获得了一个未来(在其上可以调用阻塞的get()或flatMap()).我的问题是:在Akka消息中发送期货是否可以?

示例:actor A发送消息Response to actor B,Response包含其字段中的future.然后在某个时刻A将履行创造未来的承诺.收到响应后,B可以随时调用flatMap()或get().

我问,因为Akka消息应该是不可变的,即使actor在不同的JVM上也能工作.如果演员A和B在不同的JVM上,我看不出上面的例子是如何工作的.此外,即使演员在同一个JVM上,我的示例是否有任何问题?

在此stackoverflow问题中,在接受的答案中完成了类似的操作.如果演员在不同的JVM上,这会起作用吗?



1> Arne Claasse..:

没有遥控它是可能的,但仍然不可取.使用远程处理它根本不起作用.

如果您的目标是Future使用返回s 的API ,但使用actor作为下面的管道,则一种方法可能是API在内部创建自己的actor ask,然后将该请求的未来返回给调用者.由API调用生成的actor保证是API实例的本地,并且可以通过常规tell/ receive机制与actor系统的其余部分进行通信,因此不会Future将其作为消息发送.

class MyTaskAPI(actorFactory: ActorRefFactory) {

   def doSomething(...): Future[SomethingResult] = {
     val taskActor = actorFactory.actorOf(Props[MyTaskActor])
     taskActor ? DoSomething(...).mapTo[SomethingResult]
   }
 }

在哪里MyTaskActor接收DoSomething,捕获发送者,发出任务进程的请求,并且可能become是接收状态SomethingResult,最终响应捕获的发送者并停止自己.这种方法为每个请求创建两个actor,一个显式地,MyTaskActor一个隐式地,处理器ask,但保持所有状态在actor内.

或者,您可以使用ActorDSL创建一个内联的actor,doSomething并使用捕获Promise完成而不是使用ask:

class MyTaskAPI(system: System) {

   def doSomething(...): Future[SomethingResult] = {
     val p = Promise[SomethingResult]()
     val tmpActor = actor(new Act {
       become {
         case msg:SomethingResult => 
            p.success(msg)
            self.stop()
       }
     }
     system.actorSelection("user/TaskHandler").tell(DoSomething(...), tmpActor)
     p.future
   }
 }

这种方法有点偏离我的头脑,它确实使用API​​和临时演员之间的共享值,有些人可能会认为这是气味,但应该知道如何实现您的工作流程.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有