Я пытаюсь настроить SimpleMessageListenerContainer из Spring AMQP с канальными транзакциями, чтобы динамически добавлять потребителей по требованию. Проблема в том, что я не вижу, чтобы потребители добавлялись динамически, когда у меня есть транзакция с каналами. Чтобы было ясно, это не динамически добавлять потребителей под нагрузкой:SimpleMessageListenerContainer ChannelTransacted и MaxConcurrentConsumers
container.setMaxConcurrentConsumers(5);
container.setChannelTransacted(true);
container.setTransactionManager(rabbitTransactionManager);
Но это делает:
container.setMaxConcurrentConsumers(5);
//container.setChannelTransacted(true);
//container.setTransactionManager(rabbitTransactionManager);
Мои вопросы:
- Почему не потребители добавляются динамически?
- Есть ли обходной путь для того, чтобы заставить как транслируемые транзакции, так и динамические потребители работать?
Я открыл [JIRA Issue] (https://jira.spring.io/browse/AMQP-498). –
Благодарим вас за открытие проблемы. Моя команда использует их, потому что мы думали, что они помогают уменьшить потерю сообщений. Есть ли лучшая стратегия, которую вы предлагаете? –
Вам не нужны транзакции со стороны потребителя, чтобы избежать потери сообщений; на стороне потребителя, транзакции применяются только к ack, а не к доставке самого сообщения. Нет никакой опасности потерять сообщения даже без транзакций, поскольку они удаляются только из очереди при получении ack (то есть, когда вы используете AUTO ackmode - по умолчанию - вы * можете * потерять сообщения, если используете AckMode NONE - называемый autoAck в заявке на кролик). Вы можете прочитать [все о транзакциях в документах RabbitMQ] (https://www.rabbitmq.com/semantics.html). –