JMSListener-动态选择器 [英] JMSListener - dynamic selector

查看:320
本文介绍了JMSListener-动态选择器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前有一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆