【问题标题】:Akka and Ask Pattern. When Actor is abruptly stopped can i return Future?Akka 和询问模式。当 Actor 突然停止时,我可以返回 Future 吗?
【发布时间】:2014-10-14 23:42:03
【问题描述】:

我目前有使用 Ask Pattern 分派请求的代码。分派的请求将生成一个 Akka Actor,它发送一个 HTTP 请求,然后返回响应。我正在使用 Akka 的断路器 API 来管理我调用的上游 Web 服务的问题。

如果断路器处于打开状态,那么所有后续请求都会快速失败,这是预期的效果。然而,当actor快速失败时,它只是抛出一个CircuitBreakerOpenException,停止actor,但是控制不会返回到发出初始请求的代码,直到生成AskTimeoutException。

这是发送请求的代码

Timeout timeout = new Timeout(Duration.create(10, SECONDS));
Future<Object> future = Patterns.ask(myActor, argMessage, timeout);
Response res = (Response ) Await.result(future, timeout.duration());

这是断路器

getSender().tell(breaker.callWithSyncCircuitBreaker(new Callable<Obj>() 
                    {
                        @Override
                        public Obj call() throws Exception {
                            return fetch(message);
                        }
                    }), getSelf()
            );
getContext().stop(getSelf());

当执行此代码块并且如果电路打开时,它会快速抛出异常失败,但是我想将控制权返回给处理未来的代码,而无需等待超时。

这可能吗?

【问题讨论】:

    标签: java akka circuit-breaker


    【解决方案1】:

    当actor失败并重新启动时,如果它正在处理消息,则不会自动向该发送者发送任何响应。如果您想在特定失败时向该发件人发送消息,则显式捕获该异常并以失败结果回复该发件人,确保在进入任何未来回调之前先捕获发件人以避免关闭此可变状态.您也可以尝试在 preRestart 中执行此操作,但这不是很安全,因为到那时如果您在 actor 内部使用期货,发送者可能已经改变。

    【讨论】:

    • 如果在 preRestart 中 msg.isDefined() 发送 Status.Failure(cause)sender() 应该是安全的(并且如果发送者应该处理这样的消息),但不要忘记决定是否还是不要打电话给super.preRestart
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多