Akka轮询:将响应从远程路由发送到发件人

杰根

我正在使用Akka群集(版本2.4.10),其中几个节点指定为“前端”角色,而其他几个节点则指定为“工作人员”。工人在远程机器上。前端角色通过循环路由将传入的工作分配给工人。问题是将响应从“工作人员”发送回前端参与者。我可以看到工作正在由工人完成。但是,工人发送给前端的消息没有到达并最终变成死信。我在日志中看到以下错误。

[Cluster-akka.actor.default-dispatcher-21] [akka://Cluster/deadLetters] Message [scala.collection.immutable.$colon$colon] from Actor[akka://Cluster/user] to Actor[akka://Cluster/deadLetters] was not delivered. [6] dead letters encountered.

我已经看到了这一点,并且在我的代码中也遵循了同样的观点。我也看到了这一点,但是建议的解决方案在这种情况下不适用,因为我不知道预先的路线。它来自配置,并且可以更改。循环路由器的配置如下。

akka.actor.deployment {
  /frontEnd/hm = {
    router = round-robin-group
    nr-of-instances = 5
    routees.paths = ["/user/hmWorker"]
    cluster {
      enabled = on
      use-role = backend
      allow-local-routees = on
    }
  }
}

路由器在前端参与者中实例化,如下所示。

val router = context.actorOf(FromConfig.props(), name = "hm")
val controller = context.actorOf(Props(classOf[Controller], router))

控制器和工作人员代码如下。

// Node 1 : Controller routes requests using round-robin
class Controller(router: ActorRef) extends Actor {

    val list = List("a", "b") // Assume this is a big list

    val groups = list.grouped(500)

    override def receive: Actor.Receive = {
      val futures = groups.map(grp => (router ? Message(grp)).mapTo[List[String]]))
      val future = Future.sequence(futures).map(_.flatten)
      val result = Await.result(future, 50 seconds)
      println(s"Result is $result")
    }
}

// Node 2
class Worker extends Actor {

    override def receive: Actor.Receive = {
      case Message(lst) =>
            val future: Future[List[String]] = // Do Something asynchronous
            future onComplete {
                case Success(r) => sender.!(r)(context.parent) // This message is not delivered to Controller actor.
                case Failure(th) => // Error handling
            }
    }
}

请让我知道我在做什么错。感谢您的帮助。

rgcase

您不应该sender()在的回调中使用Future在处理回调时,sender()可能指的是与您收到消息时不同的东西。

考虑先将引用保存在回调之外,例如:

override def receive: Actor.Receive = {
  case Message(lst) =>
        val future: Future[List[String]] = // Do Something asynchronous
        val replyTo: ActorRef = sender()
        future onComplete {
            case Success(r) => replyTo.!(r)(context.parent) // This message is not delivered to Controller actor.
            case Failure(th) => // Error handling
        }
}

甚至更好的是,使用管道模式:

import akka.pattern.pipe
override def receive: Actor.Receive = {
  case Message(lst) =>
    val future: Future[List[String]] = // Do Something asynchronous
    future.pipeTo(sender())
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Chromecast将消息从自定义收件人发送到发件人应用?

来自分类Dev

无法将电子邮件发送到laravel 5中动态的电子邮件发件人

来自分类Dev

设置邮件的发件人,然后再发送到Outlook中

来自分类Dev

有什么方法可以使用按钮发件人将文本(在按钮上)直接发送到列表框中

来自分类Dev

在将消息添加到jms队列之前,如何从ESB向发件人发送响应

来自分类Dev

在将消息添加到jms队列之前,如何从ESB向发件人发送响应

来自分类Dev

Socket.io:发送到命名空间中的所有客户端(发件人除外)

来自分类Dev

无法将nodemailer错误响应从node.js发送到angular.js

来自分类Dev

如何将响应从 c# 类文件发送到 MVC 控制器

来自分类Dev

Bleno:如何将消息发送回发件人?

来自分类Dev

Akka测试-发件人已死

来自分类Dev

Akka对发件人的未来回应

来自分类Dev

Akka 演员 - 发件人指向死信

来自分类Dev

Akka.Remote-解除关联后无法将消息发送到远程actor

来自分类Dev

电子邮件轮询:阅读主题和发件人

来自分类Dev

将参数从路由发送到 htmlfile

来自分类Dev

Socket.io仅向发件人发送回多个响应

来自分类Dev

使用apache Camel将SOAP请求发送到远程Web服务并获得响应

来自分类Dev

除了POJO以外,还有其他方法可以将JSON形式的响应从服务器端发送到angular吗?

来自分类Dev

socket.io仅将数据包发送给发件人

来自分类Dev

如何使用消息传递架构将消息发送回发件人?

来自分类Dev

使用“发送为”发送邮件或更改发件人

来自分类Dev

发件人成为演员[akka:// Main / deadLetters]

来自分类Dev

将邮件从发件人移动到发件人的文件夹名称

来自分类Dev

发件人通知

来自分类Dev

Neo4j希望返回发件人,将多个唯一的附件发送给收件人

来自分类Dev

JAXB,REST将XML对象发送到远程URL

来自分类Dev

将消息框发送到远程PC列表

来自分类Dev

通过SSH将按键发送到远程X会话

Related 相关文章

  1. 1

    如何使用Chromecast将消息从自定义收件人发送到发件人应用?

  2. 2

    无法将电子邮件发送到laravel 5中动态的电子邮件发件人

  3. 3

    设置邮件的发件人,然后再发送到Outlook中

  4. 4

    有什么方法可以使用按钮发件人将文本(在按钮上)直接发送到列表框中

  5. 5

    在将消息添加到jms队列之前,如何从ESB向发件人发送响应

  6. 6

    在将消息添加到jms队列之前,如何从ESB向发件人发送响应

  7. 7

    Socket.io:发送到命名空间中的所有客户端(发件人除外)

  8. 8

    无法将nodemailer错误响应从node.js发送到angular.js

  9. 9

    如何将响应从 c# 类文件发送到 MVC 控制器

  10. 10

    Bleno:如何将消息发送回发件人?

  11. 11

    Akka测试-发件人已死

  12. 12

    Akka对发件人的未来回应

  13. 13

    Akka 演员 - 发件人指向死信

  14. 14

    Akka.Remote-解除关联后无法将消息发送到远程actor

  15. 15

    电子邮件轮询:阅读主题和发件人

  16. 16

    将参数从路由发送到 htmlfile

  17. 17

    Socket.io仅向发件人发送回多个响应

  18. 18

    使用apache Camel将SOAP请求发送到远程Web服务并获得响应

  19. 19

    除了POJO以外,还有其他方法可以将JSON形式的响应从服务器端发送到angular吗?

  20. 20

    socket.io仅将数据包发送给发件人

  21. 21

    如何使用消息传递架构将消息发送回发件人?

  22. 22

    使用“发送为”发送邮件或更改发件人

  23. 23

    发件人成为演员[akka:// Main / deadLetters]

  24. 24

    将邮件从发件人移动到发件人的文件夹名称

  25. 25

    发件人通知

  26. 26

    Neo4j希望返回发件人,将多个唯一的附件发送给收件人

  27. 27

    JAXB,REST将XML对象发送到远程URL

  28. 28

    将消息框发送到远程PC列表

  29. 29

    通过SSH将按键发送到远程X会话

热门标签

归档