Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JMSListenerConfigure的Spring引导持久JMS使用者_Java_Spring Boot_Jms_Activemq - Fatal编程技术网

Java 使用JMSListenerConfigure的Spring引导持久JMS使用者

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

我正在使用SpringBoot和activeMQ设置一个持久的JMS主题使用者。使用spring boot@JmsListener注释,我能够让一切正常工作(作为持久消费者成功运行)。但是,因为我想动态创建侦听器,所以我尝试使用JMSListenerConfiguration接口来创建它们

使用下面的代码,成功创建主题使用者并使用消息。但是,问题是它所创造的消费者并不持久。我正在工厂中将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);
        }
    }
}
@配置
@使能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,因为我有类似的要求,但我不知道如何获取列表。