【问题标题】:Patterns.ask and Await.result thread safety in akka javaAkka java 中的 Patterns.ask 和 Await.result 线程安全
【发布时间】:2014-09-29 20:02:54
【问题描述】:

我有一个通过网络接收请求的 RMI 控制器。该控制器将责任委托给 akka actor,该 actor 稍后会与一组工作人员联系以解决代数运算。

下面的代码是否足以确保我的 akka 主角色 (masterActor) 将接收并正确响应来自 RMI 为向我的控制器的每个请求创建的每个线程的所有请求?我的意思是, Patterns.ask 和 Await.result 线程安全吗?他们有办法通过互斥访问 masterActor 引用吗?或者我需要在我的控制器中创建一个关键部分?

Class MyController extends ... {

/* ... */
ActorRef masterActor;
/* ... */

public <O extends AlgebraOp<R>, R extends Equation & Resolved> R resolve(
        Equation AlgebraOp, Context context){

    EquationAndContext message = new EquationAndContext(AlgebraOp, context);

    Future<R> future = (Future<R>) Patterns.ask(masterActor, message, timeout);
    R operationResolved = null;
    boolean timeoutExpired = false;

    while(!timeoutExpired) {
        try {
            operationResolved = (R) Await.result(future, timeout.duration()); 
            timeoutExpired = true;
        } catch (Exception timeExpired) {
            /* Re-build the future for next try */
            future = (Future<R>) Patterns.ask(masterActor, message, timeout);
        }
    }

    return operationResolved;
   }

}

干杯

【问题讨论】:

    标签: java multithreading akka


    【解决方案1】:

    是的。

    如果resolve 被同时调用,您将看到Patterns.askAwait.result 没有问题。

    【讨论】:

    • 那么master会正确转发消息,并会检索到合适的响应?
    • 如果master在收到EquationAndContext消息时是这样做的,那么是的
    • master 只将该操作转发给 worker,worker 最后进行一些计算并将结果返回给使用 getSender() 的 resolve 方法。
    • 由于由 ask 创建的每个 Future 背后都有一个合成的临时参与者引用,因此如果答案从工作人员发送给正确的发件人(即任何中间参与者使用“转发”来保持原始发件人完好无损) 那么你就会得到正确的“答案”。
    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2012-06-19
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多