当前位置: 首页 > 知识库问答 >
问题:

Akka和Ask模式。当演员突然停下来时,我能回到未来吗?

邹海荣
2023-03-14

我目前有使用询问模式分派请求的代码。发送的请求将生成Akka Actor,该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());

当执行这段代码时,如果电路断开,它会快速失败并引发异常,但是我想将控制权返回到处理未来的代码,而不必等待超时。

这可能吗?

共有1个答案

刘兴修
2023-03-14

当参与者失败并重新启动时,如果它正在处理消息,则不会自动向该发送者发送响应。如果您想向该发送者发送一条关于该特定故障的消息,那么显式捕获该异常,并用失败的结果回复该发送者,确保在以后进行任何回调之前先捕获发送者,以避免结束此可变状态。您也可以尝试在重新启动前这样做,但这不是很安全,因为如果您在actor内部使用futures,那么到那时发送方可能已经改变了。

 类似资料:
  • 我在写一个小服务器。一篇博文特别推荐了这种提问模式。课程具有以下特点: 我正在检索这个数据库行,如果它不存在或发生了一些错误,我想从Spray发送一个响应来告诉客户端。 然而,使用这种模式,我不知道在哪里注入开关。 我试着把代码改成这样: Spray使用发送HTTP响应可以接受两个对象,也可以接受一个字符串/可序列化对象。我想使用双对象模式(它允许我手动编码它的标题),理想的情况应该是 有没有办法

  • 我试图在akka演员之间建立一个信息传递过程,代表主人给工人一份工作,并密切关注它。我的问题是 我在下面提出的是一个合理的方法,以及 即使不是,我也想知道如何通过期货的组成来正确完成它,为了我的未来教育。 我想要的过程是这样的 1)Master用将工作发送给Worker。它希望在5秒内得到回复,否则它认为工人失去了机会,它将不得不再次进入竞标。 2a)如果工人在5秒内没有响应,我希望主人给自己发送

  • 假设我有一个演员树,它做一堆处理。处理由客户机/连接执行元启动(即,树是服务器)。最终客户端执行元需要响应。即。我有一个演员系统看起来是这样的。 客户端系统需要的响应是叶参与者的输出(即和/或)。树中的这些参与者可能正在与外部系统交互。此树可能是一组预定义的可能路由的参与者(即,因此只有一个actorref指向参与者树的根)。 问题是管理将响应(&或)从final/leaf参与者发送回客户端参与者

  • 我正在尝试使用ask模式向远程参与者发送请求。本地actor接收一些值,并对其执行一些任务并更新它。然后,当本地参与者试图将更新后的值发送回远程参与者时,在发送时发生错误。我应该如何处理这个错误? 错误:[INFO][03/31/2017 17:28:18.383][ClientSystem-Akka.actor.Default-Dispatcher-3][Akka://ClientSystem/

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • 我用的是Scala 2.10,Akka 2.1和Play 2.1。当我向后端发送一个http请求时,我要求一个参与者计算一些东西。如果计算结果在超时之前返回,则返回计算结果,否则返回另一个字符串。请参阅下面的代码。 演员如下: 我的问题是,即使演员在超时之前完成,未来也不会“返回”任何内容,因此超时总是过期。我做错了什么?谢谢。