2016-09-13 3 views
1

В настоящее время у меня есть JMSListener, как показано ниже. Он использует селектор значения в файле свойств. Это прекрасно работает.JMSListener - динамический селектор

@JmsListener(destination = "myQueueDest", 
    selector = MyHeaders.SELECTOR_KEY + " = '${myapp.selector_val}'") 
private void consumeData(MyCustomObj mycustomObj) { } 

У меня теперь есть необходимость использовать динамический селектор со значением в памяти, а не свойство spring. Есть ли способ использовать JMSListener (или какой-либо другой механизм прослушивания), чтобы сделать выбор из очереди ActiveMQ?

Update:

Возможно присвоить идентификатор моей @JMSListener, а затем извлечь его из моей JmsListenerEndpointRegistry боба. Получите контейнер слушателя по ID, отбросите его до DefaultMessageListenerContainer и позвоните по телефону setMessageSelector(), хотя я не совсем уверен, что это будет работать.

Для этого требуется установить для моего компонента DefaultJmsListenerContainerFactory значение кэша CACHE_SESSION.

Но это не работает, так как слушатель поднимает все сообщения, независимо от того, как я устанавливал селектор сообщений.

ответ

0

Спецификация JMS указывает, что строка выбора должна быть предоставлена ​​при создании потребителя. Поэтому ответ НЕТ. Потребитель должен быть закрыт и воссоздан с другой строкой выбора, чтобы получать сообщения, соответствующие различным критериям выбора.

Если использование JMS API не является обязательным для вашего проекта, вы можете изучить использование собственных API-интерфейсов Active MQ. Я уверен, что API будет иметь возможность указывать другую строку выбора каждый раз, когда вызывается вызов. API-интерфейс IBM MQ обеспечивает такую ​​функциональность.

+0

Как я могу закрыть и воссоздать нового потребителя? есть ли где-нибудь пример создания слушателя полностью программно, не используя @JmsListener? Благодарю. –

+0

Пожалуйста, проверьте весеннюю документацию. Мои знания о Весне очень ограничены. – Shashi

+0

javadoc для setMessageSelector говорит, что он может быть установлен во время выполнения. http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/jms/listener/AbstractMessageListenerContainer.html#setMessageSelector(java.lang.String) –

Смежные вопросы