Java 使用JMSListenerConfigure的Spring引导持久JMS使用者
我正在使用SpringBoot和activeMQ设置一个持久的JMS主题使用者。使用spring boot@JmsListener注释,我能够让一切正常工作(作为持久消费者成功运行)。但是,因为我想动态创建侦听器,所以我尝试使用JMSListenerConfiguration接口来创建它们 使用下面的代码,成功创建主题使用者并使用消息。但是,问题是它所创造的消费者并不持久。我正在工厂中将clientId、setSubscriptionDurable设置为true,并将setPubSubDomain设置为true。我错过了什么Java 使用JMSListenerConfigure的Spring引导持久JMS使用者,java,spring-boot,jms,activemq,Java,Spring Boot,Jms,Activemq,我正在使用SpringBoot和activeMQ设置一个持久的JMS主题使用者。使用spring boot@JmsListener注释,我能够让一切正常工作(作为持久消费者成功运行)。但是,因为我想动态创建侦听器,所以我尝试使用JMSListenerConfiguration接口来创建它们 使用下面的代码,成功创建主题使用者并使用消息。但是,问题是它所创造的消费者并不持久。我正在工厂中将clientId、setSubscriptionDurable设置为true,并将setPubSubDomai
@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);
}
}
}
@配置
@使能JMS
公共类ListenerConfigurer实现JmsListenerConfigurer{
@自动连线
私有列表监听器配置;
@自动连线
私有连接工厂连接工厂;
@凌驾
公共无效配置JMSListender(JMSListendendPointRegistrator){
对于(JmsListenerConfig JmsListenerConfig:listenerConfigs){
SimpleJMListenerEndpoint=新的SimpleJMListenerEndpoint();
setId(jmsListenerConfig.getEndpointName());
setDestination(jmsListenerConfig.getEndpointName());
endpoint.setMessageListener(消息->{
TextMessage txtMessage=(TextMessage)消息;
试一试{
jmsListenerConfig.getMessageReceiveHandler().handle(txtMessage.getText());
}捕获(JME){
e、 printStackTrace();
}
});
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
工厂。设置连接工厂(连接工厂);
factory.setSubscriptionDurable(true);
factory.setPubSubDomain(true);
setClientId(jmsListenerConfig.getClientUid());
DefaultMessageListenerContainer=factory.createListenerContainer(端点);
setupListenerContainer(容器);
注册点(端点、工厂);
setContainerFactory(工厂)注册处;
}
}
}
我解决了我的问题。我必须在端点上设置订阅名称
endpoint.setSubscription("some-trivial-subscription-name");
有人知道为什么jms会在这里逃走吗?当我使用“some.trifole.subscription.name”时,您是否能够共享
列表listenerConfigs的bean,因为我有类似的要求,但我不知道如何获取列表。