使用JMSListenerConfigurer弹簧启动耐用JMS消费者



我正在使用Springboot和ActiveMQ设置耐用的JMS主题消费者。我能够使用Spring Boot @jmslistener注释使所有内容都可以正常运行(成功地作为耐用消费者运行(。但是,由于我想动态创建听众,所以我试图使用JMSListenerConfiguraion界面来创建它们。

使用下面的代码成功创建并消费消息。但是,问题在于它创造的消费者不耐用。我将clientId设置为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");

最新更新