Akka Camel RabbitMQ каждый раз создает новые соединения

Я использую 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. После успешного подключения к моему серверу клиент отправит идентификатор, который будет использоваться как часть ключа маршрутизации (например, command.<id>). Соединение и очередь RabbitMQ создаются, когда подключается первый клиент, а ключ маршрутизации будет примерно таким, как command.first_id. Когда подключается следующий клиент, я хотел бы добавить ключ маршрутизации command.second_d в список уже принятых ключей маршрутизации, не создавая нового подключения к RabbitMQ.


person threejeez    schedule 15.05.2015    source источник


Ответы (1)


Я считаю, что это ожидаемо. У каждого актера Akka Camel будет свой собственный Camel Context, который будет независим от других. Это означает, что для каждого нового создаваемого субъекта вы будете создавать новый контекст верблюда с новой конечной точкой RabbitMQ, которая будет содержать новое соединение RabbitMQ и новый канал.

Если в вашем сценарии очередь и обмен не меняются, а изменяется только ключ маршрутизации, почему бы вам просто не иметь одного актера Akka Camel, потребляющего из очереди, и другого актера, управляющего привязками. Каждый раз, когда необходимо использовать новый ключ маршрутизации, этот актор будет создавать соединение rabbitmq, канал и вызывать queueBind() с новым ключом маршрутизации. Кроме того, один и тот же участник может отвязать нежелательные ключи маршрутизации.

person hveiga    schedule 15.05.2015
comment
Похоже, вы предлагаете мне создавать новое соединение для каждого нового ключа маршрутизации. Это то, что вы говорите? Каждый раз, когда запрашивается новый ключ маршрутизации, его нужно будет добавлять в список ключей маршрутизации, которые уже привязаны к rabbitmq connection/exchange/queue. Могу ли я сделать это, просто создав другую привязку для уже существующей очереди? - person threejeez; 15.05.2015
comment
Я только что добавил к своему первоначальному вопросу именно то, что я пытаюсь сделать. Я надеюсь, что это поможет лучше осветить проблему. Спасибо!! - person threejeez; 15.05.2015