2016-02-09 2 views
0

В проекте я использую ActiveMQ для обработки относительно большого количества сообщений. Для этой цели есть очередь, fooQueue, которая содержит сообщения для обработки.Только один сеанс ActiveMQ обрабатывает сообщения

Два экземпляра приложения обрабатывают сообщения из этой очереди, используя Spring JMS. У меня есть DefaultMessageListenerContainer, созданный следующим образом.

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); 
container.setConnectionFactory(connectionFactory); 
container.setDestinationName(QUEUE_NAME); 
container.setMessageListener(myMessageListener); 
container.setConcurrency(getProperty("concurrency")); 
container.setSessionTransacted(true); 
container.setErrorHandler(new ErrorHandler()); 
return container; 

Глядя на AMQ веб-консоли, я могу подтвердить, что правильное число потребителей и сессий созданы (сеанс/потребитель). Тем не менее, похоже, что одна сессия выполняет большую часть работы, что приводит к тому, что приложение время от времени замораживается.

Эта сессия завершает и отменяет большинство сообщений, все остальные гораздо меньше, чем ее. Если я перезапущу один из этих двух экземпляров приложения, один сеанс в экземпляре приложения забирает работу и ведет себя одинаково.

Помимо проверки, блокируется ли myMessageListener, есть ли что-нибудь еще, что я могу сделать?

+0

Как определить правило организации сделки? У меня была аналогичная проблема, при которой отправка кучи сообщений блокировала чтение сообщений с использованием того же соединения, что и при отправке, оказалось, что отправка сообщения была выполнена в одной большой и длительной транзакции. – Tobb

+0

Хороший намек. Мне нужно будет проверить это, но я уже видел несколько потоков, ожидающих совершения транзакций. Как вы решили проблему? Отдельные соединения для приема и отправки? –

+0

Я решил, что одна транзакция на сообщение отправляется вместо одного большого. Сделки также сделали некоторые вещи JPA. – Tobb

ответ

0

Мы пробовали различные настройки, увеличивая объем памяти, используя отдельные экземпляры KahaDB для каждой очереди и т. Д., Но ничего не помогло. Что помогло разбить очередь.

0

Вы должны взглянуть на настройки prefetch на своих потребителей и как это работает. Это звучит так, как будто вы запускаете один экземпляр, и он захватывает большой кусок сообщений из очереди, прежде чем другие получат шанс. Снижение значения предварительной выборки приведет к более справедливому распределению.

+0

Спасибо за подсказку. Предварительная выборка установлена ​​в 0, что делает проблему немного более грязной. –