是的
我有一个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.ask
和Await.result
的问题。