Akka Camel RabbitMQ每次创建新的连接

时间:2015-05-15 03:24:35

标签: apache-camel akka-camel

我使用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的新连接。

1 个答案:

答案 0 :(得分:1)

我相信这是预期的。每个Akka Camel演员都有自己的Camel Context,它将独立于其他人。这意味着对于您创建的每个新actor,您将创建一个新的camel上下文,其中包含一个新的RabbitMQ端点,该端点将包含一个新的RabbitMQ连接和一个新的Channel。

如果在你的场景中队列和交换没有改变而只是路由键,你为什么不让一个Akka Camel actor从队列和另一个管理绑定的actor消耗。每次有一个需要使用的新路由密钥时,该actor将创建一个rabbitmq连接,通道并使用新的路由密钥调用queueBind()。此外,您可以让同一个actor取消绑定不需要的路由键。