Spring Boot Durable JMS Consumer с использованием JmsListenerConfigurer - PullRequest
0 голосов
/ 26 апреля 2018

Я настраиваю надежного потребителя тем JMS, используя SpringBoot и activeMQ. Я смог заставить все работать (успешно работает как надежный потребитель), используя аннотацию весенней загрузки @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 голосов
/ 26 апреля 2018

Я разобрался в своей проблеме. Мне пришлось установить имя подписки на конечной точке.

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