我正在使用SpringBoot和activeMQ设置持久的JMS主题使用者。我能够使用弹簧启动@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);
}
}
}
答案 0 :(得分:0)
我发现了我的问题。我不得不在端点上设置订阅名称。
endpoint.setSubscription("some-trivial-subscription-name");