0

我正在使用 akka-camel 订阅 rabbitmq 交换。将创建几个这样的演员......每个请求一个routingKey。交换和队列不会改变。每次routingKey请求新的演员时,我都会创建一个新的演员,而不是创建一个新的频道,而是创建一个全新的连接,这是不可取的。我不太明白为什么每次创建消费者角色时都会创建一个新连接。

这是演员代码:

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

4

1 回答 1

1

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

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

于 2015-05-15T16:56:45.370 回答