JMSListener-动态选择器 [英] JMSListener - dynamic selector
问题描述
我目前有一个JMSListener,如下所示.它在属性文件中使用值的选择器.效果很好.
I currently have a JMSListener as shown below. It uses a selector of a value in a properties file. This works fine.
@JmsListener(destination = "myQueueDest",
selector = MyHeaders.SELECTOR_KEY + " = '${myapp.selector_val}'")
private void consumeData(MyCustomObj mycustomObj) { }
我现在需要使用在内存中带有值的动态选择器,而不是spring属性.有没有一种方法可以使用JMSListener(或其他某种侦听器机制)对ActiveMQ队列进行选择?
I have a need now to use a dynamic selector with a value in memory, rather than the spring property. Is there a way to use JMSListener (or some other listener mechnaism) to do a selection off the ActiveMQ queue?
更新:
可能可以为我的@JMSListener
分配一个ID,然后从我的JmsListenerEndpointRegistry
bean中检索它.通过ID获取侦听器容器,将其转换为DefaultMessageListenerContainer
,然后调用setMessageSelector()
,尽管我不确定这是否行得通.
It may be possible to assign an ID to my @JMSListener
, and then retrieve it from my JmsListenerEndpointRegistry
bean. Get the listener container by ID, cast it to DefaultMessageListenerContainer
, and call setMessageSelector()
, although I'm not entirely sure if this will work yet.
这需要将我的DefaultJmsListenerContainerFactory bean设置为具有CACHE_SESSION
的缓存级别.
This requires setting my DefaultJmsListenerContainerFactory bean to have the cache level of CACHE_SESSION
.
但这似乎不起作用,因为无论我将消息选择器设置为什么,侦听器都会提取所有消息.
But this doesn't seem to work, as the listener picks up all messages, regardless of what I set the message selector to be.
推荐答案
如评论之一所述:
setMessageSelector的javadoc表示可以在运行时设置它. http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/jms/listener/AbstractMessageListenerContainer.html#setMessageSelector(java.lang.String)
此示例说明了如何在启动时进行设置,但是应该可以通过一些技巧来动态地进行设置:
This example explains how to setup at startup but doing it dynamically should be possible with a few more tricks:
@EnableJms
@Configuration
public class JmsConfiguration {
@Value("${my.int.param:100}")
private int config;
@Bean
public MessageConverter messageConverter() {
final MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
@Bean
public JmsListenerContainerFactory<?> specialQueueListenerFactory() {
final String selector = "foo > " + config;
final DefaultJmsListenerContainerFactory factory = new CustomJmsListenerContainerFactory(selector);
factory.setMessageConverter(messageConverter());
return factory;
}
}
还有CustomJmsListenerContainerFactory
And the CustomJmsListenerContainerFactory
public class CustomJmsListenerContainerFactory extends DefaultJmsListenerContainerFactory {
private final String selector;
public CustomJmsListenerContainerFactory(String jmsSelector) {
this.selector = jmsSelector;
}
@Override
public DefaultMessageListenerContainer createListenerContainer(JmsListenerEndpoint endpoint) {
final DefaultMessageListenerContainer instance = super.createListenerContainer(endpoint);
instance.setMessageSelector(selector);
return instance;
}
}
这篇关于JMSListener-动态选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!