Patterns.ask和Await.result在akkajava中实现线程安全



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

下面的代码足以确保我的akka master actor(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;
   }
}

干杯

是的

如果同时调用resolve,您将不会看到有关Patterns.askAwait.result的问题。

最新更新