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

使用Spray、Akka和actorSelection进行异步操作

江英华
2023-03-14

使用spray时,我一直遇到相同的设计问题,即在Akka中执行一些异步(tell)操作之后,如何为请求找到spray http请求的原始上下文。

我使用的是Net-a-Porter actor per request模型。它创建了一个子执行元,我指定该子执行元来处理每个请求,该子执行元由另一个包含正确请求上下文的执行元进行封装。

def receive: Receive = {
 case v : InputJson =>
   val id = createId
   val redisList = context.actorOf(Props[RedisListActor])
   // At this point, sender is the 'per-request' actor created, which has the HTTP context of the Spray request.
   redisList ! ListRequest(id, sender.path.toStringWithoutAddress, v)
case kr : KubernetesReply =>
  context.system.actorSelection(kr.actorPath) ! TaskResponse("Success", kr.payload, kr.id)

共有1个答案

慕容兴贤
2023-03-14

您可以将ActorRef直接放入ListRequest消息中。

case class ListRequest(id: YourIdType, requestActor: ActorRef, json: InputJson)

def receive: Receive = {
  case v : InputJson =>
    val id = createId
    val redisList = context.actorOf(Props[RedisListActor])
    redisList ! ListRequest(id, sender, v)
  case kr : KubernetesReply =>
    kr.requestActor ! TaskResponse("Success", kr.payload, kr.id)
}
 类似资料:
  • 我正在Akka、Spray和Log4j2中构建一个新应用程序。我的大多数主要系统都在“hello world”类型的模式下工作,但我很难让日志正常工作,我无法判断这是log4j2问题、Akka/Spray问题还是我的迟钝问题。 首先,我的Akka配置文件 现在,如果我把loggers行注释掉,在IntelliJ中运行这个应用程序,它在控制台中是完美的。我得到我想要的一切,我得到非常详细和有用的日志

  • 默认情况下playbook中的任务执行时会一直保持连接,直到该任务在每个节点都执行完毕.有时这是不必要的,比如有些操作运行时间比SSH超时时间还要长. 解决该问题最简单的方式是一起执行它们,然后轮询直到任务执行完毕. 你也可以对执行时间非常长(有可能遭遇超时)的操作使用异步模式. 为了异步启动一个任务,可以指定其最大超时时间以及轮询其状态的频率.如果你没有为 poll 指定值,那么默认的轮询频率是

  • 我正在尝试用Jasmine和RequireJS做一些测试。一切都进行得很好,直到我注意到我所描述的函数的上下文出现了问题。 有人知道怎么解决这个吗?

  • 我搜索了许多网站和文档,但异步调用使用的代码相同。但不确定为什么它不起作用。如果我错过了什么,有人能帮我吗?

  • 概述 定时器 Promise 对象

  • 我正在使用谷歌教程推荐的实用程序类,这个错误让我深受打击。显然,不能同时运行多个异步操作。我甚至试图在盘点仍在进行的时候开始购买,成功了。 我已经按照这里的建议尝试在我的主类中实现了,但在出现错误之前,我甚至没有得到对该方法的调用。然后我找到了这个,但我不知道在哪里可以找到这个方法——它不在类中。 现在我正在寻找一种方法来解决这个问题(而不需要重新实现整个她-邦)。我能想到的唯一解决方案是创建一个