添加动态侦听器数量(Spring JMS)

时间:2015-12-03 10:16:10

标签: java spring spring-boot jms spring-jms

我需要添加application.properties文件中提到的多个侦听器。如下,

InTopics=Sample.QUT4,Sample.T05,Sample.T01,Sample.JT7

注意:这个数字可以更多或更少。

我正在考虑将它们放入数组中,

@Value("${InTopics}")
private String[] inTopics;

但我不知道如何从数组中创建多个侦听器。

目前,我正在做一个主题,如下所示,

@Configuration
@EnableJms
public class JmsConfiguration {

@Value("${BrokerURL}")
private String brokerURL;

@Value("${BrokerUserName}")
private String brokerUserName;

@Value("${BrokerPassword}")
private String brokerPassword;

@Bean
TopicConnectionFactory connectionFactory() throws JMSException {
    TopicConnectionFactory connectionFactory = new TopicConnectionFactory(brokerURL, brokerUserName, brokerPassword);
    return connectionFactory;
}

@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(TopicConnectionFactory connectionFactory) throws JMSException {
    SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setPubSubDomain(Boolean.TRUE);
    return factory;
 }

}

和我的倾听者,

@JmsListener(destination = "${SingleTopicName}", containerFactory = "jmsContainerFactory")
public void receiveMessage(Message msg) {
   //Do Some Stuff
}

有什么方法可以达到这个目的吗?

2 个答案:

答案 0 :(得分:9)

您无法使用带注释的@JmsListener来执行此操作,但您可以通过编程方式by extending JmsListenerConfigurer as described in the reference documentation注册每个侦听器。

修改

因为您将属性作为数组注入...

@Value("${InTopics}")
private String[] inTopics;

Spring将根据列表中的队列数分割列表创建一个数组。

然后,您可以在JmsListenerConfigurer.configureJmsListeners()中迭代数组,并为数组中的每个元素创建一个端点 - 您不需要提前知道数组的大小。

for (String inTopic : inTopics) {
    ...
}

答案 1 :(得分:0)

这里是动态定义监听器数量的自定义代码。

JmsConfiguration jmsConfiguration;

private List<String> queueList;

@Bean
public DefaultJmsListenerContainerFactory mqJmsListenerContainerFactory() throws JMSException {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(jmsConfiguration.jmsConnectionFactory());
    factory.setDestinationResolver(new DynamicDestinationResolver());
    factory.setSessionTransacted(true);
    factory.setConcurrency("5");
    return factory;
}

@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {

    queueList.forEach(queue -> {
        SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
        endpoint.setId(queue);
        endpoint.setDestination(queue);
        try {
            endpoint.setMessageListener(message -> {
                try {
                    logger.info("Receieved ID: {} Destination {}", message.getJMSMessageID(), message.getJMSDestination());
                }
                catch (JMSException e) {
                    logger.info("Exception while reading message - " + e);
                }
            });
            registrar.setContainerFactory(mqJmsListenerContainerFactory());
        }
        catch (JMSException e) {
            logger.info("Exception - " + e);
        }
        registrar.registerEndpoint(endpoint);
    });

}