我使用akka-camel订阅了rabbitmq交换。将会有几个这样的演员被创建......每个请求routingKey
一个。交换和队列不会改变。每次请求新的routingKey
时,我都会创建一个新的actor,而不是创建一个新的通道,而是创建一个全新的连接,这是不可取的。我不太清楚为什么每次创建Consumer actor时都会创建一个新连接。
这是演员代码:
class CommandConsumer(routingKey: String)
extends Consumer with ActorLogging {
override def endpointUri = s"rabbitmq://localhost/hub_commands?exchangeType=topic&queue=test&autoDelete=false&routingKey=$routingKey"
override def receive: Receive = {
case msg: CamelMessage => {
log.debug(s"received {}", msg.bodyAs[String])
sender ! msg.bodyAs[String]
}
}
}
我正在创建这样的演员:
context.actorOf(CommandConsumer.props("my.routing.key", sender))
更新
这正是我需要完成的事情:
我正在编写一个TCP / IP服务器,当接受客户端连接时,需要从后端架构中的其他组件接收消息。为此,我想使用RabbitMQ。成功连接到我的服务器后,客户端将发送一个id,该ID将用作路由密钥的一部分(例如command.<id>
)。 RabbitMQ连接和队列是在第一个客户端连接时创建的,路由密钥类似于command.first_id
。当下一个客户端连接时,我想将 command.second_d
路由密钥添加到已经接受的路由密钥列表中,而不创建与RabbitMQ的新连接。
答案 0 :(得分:1)
我相信这是预期的。每个Akka Camel演员都有自己的Camel Context,它将独立于其他人。这意味着对于您创建的每个新actor,您将创建一个新的camel上下文,其中包含一个新的RabbitMQ端点,该端点将包含一个新的RabbitMQ连接和一个新的Channel。
如果在你的场景中队列和交换没有改变而只是路由键,你为什么不让一个Akka Camel actor从队列和另一个管理绑定的actor消耗。每次有一个需要使用的新路由密钥时,该actor将创建一个rabbitmq连接,通道并使用新的路由密钥调用queueBind()
。此外,您可以让同一个actor取消绑定不需要的路由键。