当我通过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
}
}
答案 0 :(得分:0)
在不太了解akka / camel集成的内部结构的情况下,让我试着展示一下这里发生的事情。首先,正如我在评论中提到的,您的actor中的sender
并不直接引用系统另一端的TCP客户端。它低于那个水平;这是ActorRef
首先发送Consumer
CamelMessage
的内容。那个演员是什么?让我试着解释一下我的想法。
endpointUri
设置基于骆驼消费者的tcp时,将会有一段代码(来自Camel)将从endpointUri
绑定到主机和端口。 ask (?)
发送给你的消费者,要么是另一个短命的演员正在处理这个消息。receive
函数被CamelMessage
命中,表示从删除客户端发送的消息中的有效负载。发生这种情况时,参与者sender
仍然是在步骤3中发送消息的任何内容。sender
,然后从那里将最终路由回该连接的连接处理程序。在那里,它将以会话状态写回套接字。一条消息,一条消息输出。我认为你的问题是你在这里打破了“一进一出”的范例。当你获得CamelMessage
时,你应该只响应一次该消息,这将逐渐回流到套接字另一端的TCP客户端。我不认为该框架需要另一个响应,这就是为什么你看到其他两个响应的动态。
所以这就引出了一个问题,你有什么样的场景需要一个“1进3出”的范例,而不是框架似乎期望的预期的“1进1出”?