akka java中的Patterns.ask和Await.result线程安全

时间:2014-09-29 20:02:55

标签: java multithreading akka

我有一个RMI控制器,它通过网络接收请求。该控制器委托akka演员负责,后者当时与工作人员联系以解决代数操作。

下面的代码是否足以确保我的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;
   }

}

干杯

1 个答案:

答案 0 :(得分:0)

是的。

如果同时调用resolve,您会发现Patterns.askAwait.result没有问题。