Скажем, у вас две Spring DefaultMessageListenerContainer
, прослушивающие одну и ту же очередь (например, ActiveMQ), запущенные на разных виртуальных машинах.
Отправка 1 000 000 сообщений. После 500 000 сообщений вы хотите, чтобы остальныеони должны обрабатываться только одним DefaultMessageListenerContainer
, НО без вызова destroy или shutdown для другого (поскольку это может понадобиться вам в будущем - и оно должно поддерживаться в управлении с JMX).Номера приведены только для примера и должны игнорироваться, их можно заменить на - «через некоторое время, после некоторых сообщений и т. Д.»
Звучит просто: остановите вызов на другом DefaultMessageListenerContainer
.Неправильно, поскольку сообщения отправляются в режиме Round Robin и они регистрируются у Потребителя.
Добавьте поддержку транзакций и выведите ошибку во второй DefaultMessageListenerContainer
каждый раз, когда приходит сообщение, оно будет свернуто.назад и взято (круговой) первым.Снова неверно, сообщения каким-то образом регистрируются у потребителя, не позволяя первому DefaultMessageListenerContainer
принять сообщение.
Даже если вы отключите / уничтожите первый DMLC - сообщение НЕ будет использовано другим DMLC.Они потребляются только в том случае, если я уничтожу JVM, в которой выполнялся теперь закрытый / уничтоженный DMLC.
Мое решение до сих пор: из-за Session.AUTO_ACKNOWLEDGE
сообщения выводятся из очереди перед входом в метод onMessageв MessageListener DefaultMessageListenerContainer
.В MessageListener
внедрите SessionAwareMessageListener
и повторно отправьте свежую копию сообщения с той же полезной нагрузкой.Но это выглядит очень грязно - я хотел бы сделать это больше в «JMS» - иным способом.