2015-05-11 2 views
2

Я пытаюсь настроить SimpleMessageListenerContainer из Spring AMQP с канальными транзакциями, чтобы динамически добавлять потребителей по требованию. Проблема в том, что я не вижу, чтобы потребители добавлялись динамически, когда у меня есть транзакция с каналами. Чтобы было ясно, это не динамически добавлять потребителей под нагрузкой:SimpleMessageListenerContainer ChannelTransacted и MaxConcurrentConsumers

container.setMaxConcurrentConsumers(5); 
container.setChannelTransacted(true); 
container.setTransactionManager(rabbitTransactionManager); 

Но это делает:

container.setMaxConcurrentConsumers(5); 
//container.setChannelTransacted(true); 
//container.setTransactionManager(rabbitTransactionManager); 

Мои вопросы:

  1. Почему не потребители добавляются динамически?
  2. Есть ли обходной путь для того, чтобы заставить как транслируемые транзакции, так и динамические потребители работать?

ответ

2
  1. Это ошибка - пожалуйста, откройте JIRA issue.

  2. Существует, к сожалению, обходное решение; ему нужен патч.

Использование транзакций с RabbitMQ довольно редко, особенно на стороне потребителя - можете ли вы объяснить, почему они вам нужны?

+0

Я открыл [JIRA Issue] (https://jira.spring.io/browse/AMQP-498). –

+0

Благодарим вас за открытие проблемы. Моя команда использует их, потому что мы думали, что они помогают уменьшить потерю сообщений. Есть ли лучшая стратегия, которую вы предлагаете? –

+1

Вам не нужны транзакции со стороны потребителя, чтобы избежать потери сообщений; на стороне потребителя, транзакции применяются только к ack, а не к доставке самого сообщения. Нет никакой опасности потерять сообщения даже без транзакций, поскольку они удаляются только из очереди при получении ack (то есть, когда вы используете AUTO ackmode - по умолчанию - вы * можете * потерять сообщения, если используете AckMode NONE - называемый autoAck в заявке на кролик). Вы можете прочитать [все о транзакциях в документах RabbitMQ] (https://www.rabbitmq.com/semantics.html). –

Смежные вопросы