Spring 使用 JmsListenerConfigurer 引导持久 JMS 消费者
Spring Boot Durable JMS Consumer using JmsListenerConfigurer
我正在使用 SpringBoot 和 activeMQ 设置一个持久的 JMS 主题使用者。使用 spring boot @JmsListener 注释,我能够让一切正常工作(成功 运行 作为持久消费者)。但是,因为我想动态创建侦听器,所以我尝试使用 JmsListenerConfiguraion 接口来创建它们。
使用下面的代码,主题消费者已成功创建并使用消息。但是,问题在于它创建的消费者不耐用。我在工厂将 clientId、setSubscriptionDurable 设置为 true,并将 setPubSubDomain 设置为 true。我错过了什么?
@Configuration
@EnableJms
public class ListenerConfigurer implements JmsListenerConfigurer {
@Autowired
private List<JmsListenerConfig> listenerConfigs;
@Autowired
private ConnectionFactory connectionFactory;
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
for(JmsListenerConfig jmsListenerConfig : listenerConfigs) {
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId(jmsListenerConfig.getEndpointName());
endpoint.setDestination(jmsListenerConfig.getEndpointName());
endpoint.setMessageListener(message -> {
TextMessage txtMessage = (TextMessage) message;
try {
jmsListenerConfig.getMessageReceiveHandler().handle(txtMessage.getText());
}catch (JMSException e){
e.printStackTrace();
}
});
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(true);
factory.setPubSubDomain(true);
factory.setClientId(jmsListenerConfig.getClientUid());
DefaultMessageListenerContainer container = factory.createListenerContainer(endpoint);
endpoint.setupListenerContainer(container);
registrar.registerEndpoint(endpoint, factory);
registrar.setContainerFactory(factory);
}
}
}
我想通了我的问题。我必须在端点上设置订阅名称。
endpoint.setSubscription("some-trivial-subscription-name");
我正在使用 SpringBoot 和 activeMQ 设置一个持久的 JMS 主题使用者。使用 spring boot @JmsListener 注释,我能够让一切正常工作(成功 运行 作为持久消费者)。但是,因为我想动态创建侦听器,所以我尝试使用 JmsListenerConfiguraion 接口来创建它们。
使用下面的代码,主题消费者已成功创建并使用消息。但是,问题在于它创建的消费者不耐用。我在工厂将 clientId、setSubscriptionDurable 设置为 true,并将 setPubSubDomain 设置为 true。我错过了什么?
@Configuration
@EnableJms
public class ListenerConfigurer implements JmsListenerConfigurer {
@Autowired
private List<JmsListenerConfig> listenerConfigs;
@Autowired
private ConnectionFactory connectionFactory;
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
for(JmsListenerConfig jmsListenerConfig : listenerConfigs) {
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId(jmsListenerConfig.getEndpointName());
endpoint.setDestination(jmsListenerConfig.getEndpointName());
endpoint.setMessageListener(message -> {
TextMessage txtMessage = (TextMessage) message;
try {
jmsListenerConfig.getMessageReceiveHandler().handle(txtMessage.getText());
}catch (JMSException e){
e.printStackTrace();
}
});
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(true);
factory.setPubSubDomain(true);
factory.setClientId(jmsListenerConfig.getClientUid());
DefaultMessageListenerContainer container = factory.createListenerContainer(endpoint);
endpoint.setupListenerContainer(container);
registrar.registerEndpoint(endpoint, factory);
registrar.setContainerFactory(factory);
}
}
}
我想通了我的问题。我必须在端点上设置订阅名称。
endpoint.setSubscription("some-trivial-subscription-name");