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

在用Akka处理下一个消息之前等待异步将来调用

魏楷
2023-03-14

当接收事件时,Akka参与者将一次处理一条消息,直到请求完成后才移动到下一条消息。

例如:

 def doThing():Future[Unit] = /* Non blocking request here */

 def receive = {
     case DoThing => doThing() pipeTo sender
 } 

这将调用doThing()并开始处理未来,但不会在处理下一条消息之前等待它完成--它将简单地以尽可能快的速度执行队列中的下一条消息。

实质上,Akka似乎认为“返回未来”是“完成处理”,并进入下一个消息。

def receive = {
    case DoThing => sender ! blocking(Await.result(doThing()))
}

共有1个答案

蓝苗宣
2023-03-14

正如注释中所建议的,您可以使用stash(http://doc.akka.io/docs/akka/current/scala/actors.html#stash)特性来存储传入消息,同时等待future解析。

需要保存当前发件人,这样您就不会在发件人执行元引用上不正确地关闭。您可以通过一个简单的case类来实现这一点,比如下面定义的case类。

class MyActor extends Actor with Stash {

  import context.dispatcher

  // Save the correct sender ref by using something like
  // case class WrappedFuture(senderRef: ActorRef, result: Any)
  def doThing(): Future[WrappedFuture] = ???

  override def receive: Receive = {
    case msg: DoThing =>
      doThing() pipeTo self

      context.become({
        case WrappedFuture(senderRef, result) =>
          senderRef ! result
          unstashAll()
          context.unbecome()
        case newMsg: DoThing =>
          stash()
      }, discardOld = false)
  }
}
 类似资料:
  • Hi akka古鲁们:)你能在这一次指导我吗? 我要做的是-演员A向演员B要消息,然后等一个回来。但是,不知何故,演员B给A的不是一条信息,而是其中的4条信息。A正确完成,但rest消息中有3条被算作死信。为什么?这样对吗?我是说,演员A有一个合适的处理人,那为什么信都死了?:-( [INFO][11/22/2013 22:00:38.975][ForkJoinPool-2-worker-7][a

  • 我有以下兔子听者: 我需要将listener配置为在它处理一条消息后等待15分钟,然后再接收下一条消息。不需要在此方法中等待。我所需要的只是在处理完一条后不接收任何消息。可以通过来完成,但我不确定这是否是实现这一点的最佳方法。对于这种情况有没有rabbitmq的配置?

  • 我想使用异步并等待处理承诺。我想在下面的示例中使用这个方法: 在执行时,它给了我一个错误 错误: UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。(拒绝ID:3)

  • 我的代码仍在工作,我可以发送消息并等待消息发送完毕。发送消息的持续时间大约为10秒,这对我不好,因为我的程序需要1秒的间隔才能发送下一条消息。看看以澄清问题。 msg4- msg4、msg3和msg2仍在等待,直到msg1发送/失败。 这是代码sendMessage.java 在我看来。java类 第一条消息已成功发送,但第二条消息等未发送。如何使这些等待直到发送第一条消息?

  • 问题内容: 我正在构建一个使用的库,我想知道是否可以将本机模块与一起使用。我知道这只是背景中的Promises,所以有本机的方法来实现方法或功能的实现吗?目前,我正在使用Bluebird,但我不知道这是否是一个坏模式。 例: 我将原生Promises和Bluebird结合在一起。我应该只使用Bluebird吗? 问题答案: 我正在构建一个使用async / await的库,我想知道是否可以在asy

  • 问题内容: 我正在制作一个经常刷新数据的函数,而我的请求链存在问题。问题是我有一个运行异步请求的for循环,并且for循环将在请求完成之前完成。 如果我要运行此代码,它将显示: 我知道是什么问题。事实上,for循环不会等待请求完成。我不知道这是一种解决方法。有人有什么想法吗? 问题答案: 您需要异步库。 例如, 可以这样写: 异步中有很多方便的实用程序函数,这些函数使回调的使用变得更加容易。