我需要添加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
}
有什么方法可以达到这个目的吗?
答案 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);
});
}