阿卡恢复不起作用?即使一切执行正常,仍然会抛出异常

时间:2014-08-09 18:22:44

标签: java scala exception akka actor

我有一个看起来像这样的演员。 当我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替换为对发件人的回复,那就可以了。

1 个答案:

答案 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());