我正在使用Springboot和ActiveMQ设置耐用的JMS主题消费者。我能够使用Spring Boot @jmslistener注释使所有内容都可以正常运行(成功地作为耐用消费者运行(。但是,由于我想动态创建听众,所以我试图使用JMSListenerConfiguraion界面来创建它们。
使用下面的代码成功创建并消费消息。但是,问题在于它创造的消费者不耐用。我将clientId设置为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");