2015-08-25 62 views
0

我们有一个用例,我们有如下设置: 主类型的Actor和worker类型的Actor。akka patterns.ask实现细节

主站接收到输入的工作请求并使用工作人员编排并生成​​结果。

有一个计划来创建一个名为client.java的Java类。这将创建一个新的主实例并将工作发送给它。此客户端使用 - Patterns.ask来获取将来的指针,并在其后得到结果,直到结果到达。

Patterns.ask(master, initialMessage, t);  
Await.result to get the message 

Patterns.ask的内部文件说将创建一个临时actor。但是,当我调用并尝试打印master中的发送者的hashCode时,每次都看起来是同一个actor。

我有以下的忧虑:

  1. 如何Patterns.ask的并发调用管理?它可以在调用后像线程一样发生,请求获取将来的指针,但将错误的数据放入其中?
  2. 它如何保证未来的指针只填充相关的响应而不与其他人的响应混淆?
    对于例如:FutureX =未来预计X消息
    FutureY =未来预计Y消息
    FutureX能否获得Y和FutureY获得X?

回答

0

我还没有阅读Patterns.ask内部文档,但我认为它使用ActorRef.forward(消息,上下文)以便坚持发送消息。此外,您不应该阻止(Await.result()),而应该使用akka.dispatch.Futures提供的工厂方法来应用回调。您可以到链和回收今后的任务(及以上),并得到一个更好的方式应用性能如下所述:

http://doc.akka.io/docs/akka/2.3.12/java/futures.html#Functional_Futures

0

所有参与者在ATLEAST一个或多个线程池运行(您可以配置在Akka的默认application.conf文件中,这些是常规的Java ExecutorService,所以如果您想了解更多信息,请查看ExecutorService源代码)。 Akka(实际上是演员模型)的美妙之处在于,每个普通演员都是孤立的,没有类型的,迫使你“要求”一个Actor来改变状态或者回复一个状态,而不是你如何使用普通线程来做到这一点。

我假设Akka在内部解决了所有昂贵的锁定和低级并发问题,当两个参与者都在不同的线程上运行时,您可以像开发人员不必这样做。 每个角色都有自己的邮箱(它由一个ConcurrentLinkedQueue支持,它不是阻塞的)。这意味着,无论您发送给演员的消息是否为“即发即忘”类型或请求状态(请求),它都会被排入邮箱并按顺序依次处理。

+0

对于这个问题的上下文,让我们假设,我需要阻止。鉴于此,如何处理Patterns.ask的并发执行?如何问是在里面实现的?这位演员被用来接收最终数据(作为问答的结果),它的生活是什么以及它是如何分享的?这个actor如何在正确的Future对象中填充正确的数据? –

+0

这是否意味着使用Patterns.ask创建的actor将拥有所有响应,并可能保持它发送的期货的hashmap以及响应并更新waiter \ –