Akka-Scala-Camel-TCP套接字中的多条消息发送到死信

时间:2015-03-01 08:33:09

标签: scala tcp apache-camel akka

当我通过TCP套接字从非akka客户端收到一条消息时,我需要回复三条消息。在下面给出的下面的示例中,只有第一个正确地通过发送方(非客户端的TCP客户端)。剩下的两个人都去了死信。任何的想法?提前谢谢。

object TcpExample {
def main(args: Array[String]): Unit = {
    val system = ActorSystem("some-system")
    val tcpConsumer = system.actorOf(Props[TcpConsumer])
    }
class TcpConsumer extends Consumer {
    def endpointUri = "mina2:tcp://localhost:6200?textline=true"
    def receive = {
        case msg: CamelMessage => {
            sender ! msg.bodyAs[String]
            sender ! msg.bodyAs[String]     // This goes to dead letter
            sender ! msg.bodyAs[String]     // This goes to dead letter
        }
        case msg: Failure => sender ! msg
    }
}

1 个答案:

答案 0 :(得分:0)

在不太了解akka / camel集成的内部结构的情况下,让我试着展示一下这里发生的事情。首先,正如我在评论中提到的,您的actor中的sender并不直接引用系统另一端的TCP客户端。它低于那个水平;这是ActorRef首先发送Consumer CamelMessage的内容。那个演员是什么?让我试着解释一下我的想法。

  1. 当您基于endpointUri设置基于骆驼消费者的tcp时,将会有一段代码(来自Camel)将从endpointUri绑定到主机和端口。
  2. 当一个新的连接请求进入时(基于外部客户端打开与该套接字的连接),可能会启动某种类型的actor以处理该单个连接。因此,将有1-n个“连接处理程序”actor实例与打开的连接数相匹配。
  3. 当邮件进入时,它很可能会通过该连接处理程序actor。从那里开始,它要么通过ask (?)发送给你的消费者,要么是另一个短命的演员正在处理这个消息。
  4. 无论哪种方式,下一站都是您的消费者,其中receive函数被CamelMessage命中,表示从删除客户端发送的消息中的有效负载。发生这种情况时,参与者sender仍然是在步骤3中发送消息的任何内容。
  5. 您的消费者现在会将消息发送回sender,然后从那里将最终路由回该连接的连接处理程序。在那里,它将以会话状态写回套接字。一条消息,一条消息输出。
  6. 我认为你的问题是你在这里打破了“一进一出”的范例。当你获得CamelMessage时,你应该只响应一次该消息,这将逐渐回流到套接字另一端的TCP客户端。我不认为该框架需要另一个响应,这就是为什么你看到其他两个响应的动态。

    所以这就引出了一个问题,你有什么样的场景需要一个“1进3出”的范例,而不是框架似乎期望的预期的“1进1出”?