Spring 使用 JmsListenerConfigurer 引导持久 JMS 消费者

Spring Boot Durable JMS Consumer using JmsListenerConfigurer

我正在使用 SpringBoot 和 activeMQ 设置一个持久的 JMS 主题使用者。使用 spring boot @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);
        }
    }
}

我想通了我的问题。我必须在端点上设置订阅名称。

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