DefaultMessageListenerContainer, управляемый с несколькими потребителями JMX + ActiveMQ в одной очереди - PullRequest
2 голосов
/ 22 ноября 2011

Скажем, у вас две 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 DefaultMessageListenerContainerMessageListener внедрите SessionAwareMessageListener и повторно отправьте свежую копию сообщения с той же полезной нагрузкой.Но это выглядит очень грязно - я хотел бы сделать это больше в «JMS» - иным способом.

1 Ответ

1 голос
/ 22 ноября 2011

Я не совсем понимаю эту часть: «[сообщения] регистрируются у Потребителя».Вы имеете в виду, что ActiveMQ решает, какой слушатель отправит это?Что именно происходит, когда вы вызываете «стоп» в DMLC?

Я не знаю, поможет ли это преодолеть ваши трудности, но вот идея: селекторы сообщений в DMLC live : вы можете изменить их в любое время, и они вступают в силу немедленно.Возможно, попробуйте изменить селектор сообщений на «ЛОЖЬ»;все кэшированные сообщения должны завершить обработку, а новые должны перестать поступать.

...