使用JmsListenerConfigurer的Spring Boot Durable JMS Consumer

时间:2018-04-26 17:15:24

标签: java spring-boot jms activemq

我正在使用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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我发现了我的问题。我不得不在端点上设置订阅名称。

endpoint.setSubscription("some-trivial-subscription-name");