我有一个看起来像这样的演员。 当我await.result异常时,我得到了IllegalState异常,尽管事实上我使用的是recoverWith。我可以看到系统打印ln工作,所以我知道这是正确的组成。这在java中比在scala中更难!
该怎么办?我以为它应该不再返回异常了。
public void onReceive(final Object message) throws Exception {
if (message instanceof MyMessage) {
final String key = ((messages.MyMessage) message).getKey();
F.Promise<T> promise = asyncService.get(key);
promise.wrapped().recoverWith(new Recover<Future<T>>() {
@Override
public Future<T> recover(Throwable failure) throws Throwable {
if (failure instanceof IllegalStateException) {
Future future = Patterns.ask(serviceActor, key, timeout);
future.onSuccess(new OnSuccess() {
@Override
public void onSuccess(Object result) throws Throwable {
System.out.println("Here");
}
}, context().dispatcher());
return future;
} else {
throw failure; //there is actually an issue.
}
}
}, context().system().dispatcher()); //also tried context().dispatcher()
Patterns.pipe(promise.wrapped(), context().dispatcher()).to(sender());
} else {
log.warning("Unexpected message type - Cache actor ignoring message: " + message.toString());
unhandled(message);
}
}
如果我在原始上下文中创建了一个发送者var,并将System.out.println替换为对发件人的回复,那就可以了。
答案 0 :(得分:3)
之前我没有在Java中使用Akka,但我认为你的问题就在这一行:
promise.wrapped().recoverWith(new Recover<Future<T>>() {
你正在那里获得scala的未来,而你正在呼叫recoverWith
。 但这并没有改变承诺的原始潜在未来!它反而创造了一个新的未来。因此我建议改变这样的代码。您将这个新的未来分配给变量并将这个新的管道传递给您的发件人:
Future<T> recovered = promise.wrapped().recoverWith(new Recover<Future<T>>() {
...
Patterns.pipe(recovered, context().dispatcher()).to(sender());