【问题标题】:Akka Camel RabbitMQ Creating New Connections Every TimeAkka Camel RabbitMQ 每次都创建新连接
【发布时间】:2015-05-15 03:24:35
【问题描述】:

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

【问题讨论】:

    标签: apache-camel akka-camel


    【解决方案1】:

    我相信这是意料之中的。每个 Akka Camel 演员都有自己的骆驼上下文,这些上下文将独立于其他人。这意味着,对于您创建的每个新参与者,您都将创建一个新的骆驼上下文,其中包含一个新的 RabbitMQ 端点,该端点将持有一个新的 RabbitMQ 连接和一个新的通道。

    如果在您的场景中队列和交换没有改变,而只是路由键,为什么不让一个 Akka Camel 参与者从队列中消费,而另一个参与者管理绑定。每次有一个新的路由键需要消费时,这个actor都会创建一个rabbitmq连接、通道并使用新的路由键调用queueBind()。此外,您可以让同一个参与者解除对不需要的路由键的绑定。

    【讨论】:

    • 听起来你建议我为每个新的路由键创建一个新的连接。这就是你说的吗?每次请求新的路由键时,都需要将其添加到已经绑定到 rabbitmq 连接/交换/队列的路由键列表中。我是否可以通过简单地为现有队列创建另一个绑定来做到这一点?
    • 我刚刚在我的原始问题中添加了我想要做的事情。我希望这有助于更好地阐明问题。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多