DefaultMessageListenerContainer не получает сообщения

У меня есть DefaultMessageListenerContainer, настроенный следующим образом:

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConcurrentConsumers(4);
container.setConnectionFactory(connectionFactory);
container.setDestinationName(String.format("Consumer.%s.VirtualTopic.%s", group, topic));
container.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
container.setSessionTransacted(true);
container.setMessageListener(new DelegatingMessageListener(listener, messageMapper, event));

container.start();

Контейнер сообщений никогда не получает сообщения, и мой слушатель сообщений никогда не вызывается. Оставив все остальное без изменений, если я просто переключу DefaultMessageListenerContainer на SimpleMessageListenerContainer, он работает, но SimpleMessageListenerContainer не восстанавливается после потери соединения.

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


person Colin M    schedule 26.01.2014    source источник
comment
Для меня это не имеет никакого смысла; попробуйте включить ведение журнала на уровне TRACE.   -  person Gary Russell    schedule 26.01.2014
comment
@GaryRussell Я включил трассировку. Сам ActiveMQ, кажется, даже ничего не регистрирует, указывая на то, что подписка на самом деле никогда не происходит (что я подозревал). Заглянув в исходный код Spring, я вижу, что SimpleMessageListenerContainer имеет переопределенный doStart метод, который фактически создает слушателей. Я не вижу соответствующего кода в DefaultMessageListenerContainer, что интересно. Может я что-то упускаю.   -  person Colin M    schedule 26.01.2014
comment
Ну конечно; естественно; вам нужно позвонить afterPropertiesSet().   -  person Gary Russell    schedule 26.01.2014


Ответы (1)


При создании контейнера на Java (вне контекста приложения Spring) вам необходимо вызвать afterPropertiesSet() перед start().

Контекст делает это автоматически для Spring beans.

person Gary Russell    schedule 26.01.2014
comment
Спасибо! Это сработало отлично. Теперь чувствую себя глупо. Я бы просто зарегистрировал все через контекст, но у меня есть этот код в общей библиотеке, от которой зависит каждая служба, и службы подписываются на абстракцию над уровнем Spring JMS (поэтому они ничего не знают о существовании JMS - они просто отправляют и откуда-то реагируют на события). - person Colin M; 26.01.2014