Akka Camel RabbitMQ Создание новых подключений каждый раз

Я использую akka-верблюда, чтобы подписаться на обмен rabbitmq. Будет создано несколько таких актеров... по одному на каждый routingKey, Обмен и очередь не меняются. Каждый раз новый routingKey запрашивается создание нового действующего лица, и вместо создания нового канала создается совершенно новое соединение, что нежелательно. Я не совсем понимаю, почему создается новая связь каждый раз, когда создается актер Consumer.

Вот код актера:

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.

1 ответ

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

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

Другие вопросы по тегам