Вопросы по JMS Pub / Sub

Я новичок в JMS pub / sub, использую Spring boot и Apache Active MQ. Не могли бы вы помочь разобраться в приведенных ниже сценариях?

Сценарий 1:

Шаг 1. У меня есть издатель, который публикует сообщение (Say MessageA) в теме (Say TopicA), и в то время, когда оно было опубликовано, не было подписчиков / потребителей, поэтому сообщение попадает в Сообщения, поставленные в очередь в Apache Active MQ.

Шаг 2. У меня теперь есть новый подписчик на TopicA. Как потребовать более ранний MessageA, который уже был сообщениями, помещенными в очередь в Apache Active MQ?

Мой вывод: раньше никто не подписывался и, следовательно, вы можете не получить сообщениеA. (Пожалуйста, поправьте, если я ошибаюсь)

Сценарий 2:

Шаг 1. У меня есть издатель, который публикует сообщение (Say MessageA) в теме (Say TopicA), и подписчик успешно получил MessageA.

Шаг 2. Теперь система подписчиков не работает из-за некоторых внутренних / сетевых проблем, и в TopicA было опубликовано сообщение MessageA. Когда система подписчиков запущена и работает, как вернуть более раннее сообщение MessageA, которое было опубликовано в TopicA, когда система подписчиков не работала?

Это необходимо для того, чтобы даже при отказе подписчиков он по-прежнему получал сообщения, поставленные в очередь.

Спасибо за редактирование! Это изменение будет видно только вам, пока оно не будет проверено коллегами.

Я новичок в JMS pub / sub, использую Spring boot и Apache Active MQ. Не могли бы вы помочь разобраться в приведенных ниже сценариях?

Сценарий 1:

Шаг 1. У меня есть издатель, который публикует сообщение (Say MessageA) в теме (Say TopicA), и в то время, когда оно было опубликовано, не было подписчиков / потребителей, поэтому сообщение попадает в Сообщения, поставленные в очередь в Apache Active MQ.

Шаг 2. У меня появился новый подписчик на TopicA. Как потребовать более ранний MessageA, который уже был сообщениями, помещенными в очередь в Apache Active MQ?

Мой вывод: раньше никто не подписывался и, следовательно, вы можете не получить сообщениеA. (Пожалуйста, поправьте, если я ошибаюсь)

Сценарий 2:

Шаг 1. У меня есть издатель, который публикует сообщение (Say MessageA) в теме (Say TopicA), и подписчик успешно получил MessageA.

Шаг 2. Теперь система подписчиков не работает из-за некоторых внутренних / сетевых проблем, и в TopicA было опубликовано сообщение MessageA. Когда система подписчиков запущена и работает, как вернуть более раннее сообщение MessageA, которое было опубликовано в TopicA, когда система подписчиков не работала?

Это необходимо для того, чтобы даже при отказе подписчиков он по-прежнему получал сообщения, поставленные в очередь.

Мой код производителя:

@Bean
public JmsTemplate jmsTemplate(){
    JmsTemplate template = new JmsTemplate();
    template.setConnectionFactory(connectionFactory());
    template.setPubSubDomain(true);
    template.setDeliveryMode(DeliveryMode.PERSISTENT);
    return template;
}

Мой потребительский код:

@Bean
public JmsListenerContainerFactory<?> jsaFactory(ConnectionFactory connectionFactory,
                                                DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setPubSubDomain(true);
    factory.setSubscriptionDurable(true);
    configurer.configure(factory, connectionFactory);
    return factory;
}
 


person Rathnavel Palani    schedule 18.12.2018    source источник


Ответы (1)


Вам необходимо создать длительную подписку:

MessageConsumer consumer = session.createDurableSubscriber(destination, "Listener" + i);

Создатель сообщения должен быть постоянным:

messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
person Just another Java programmer    schedule 18.12.2018
comment
мне нужно установить в JMSListener? - person Rathnavel Palani; 18.12.2018
comment
Пожалуйста, найдите мои фрагменты кода производителя и потребителя, обновленные выше при весенней загрузке. Я добавил ваше предложение, но оно все еще не работает для меня. Пожалуйста, порекомендуйте. - person Rathnavel Palani; 19.12.2018
comment
Извините, у меня не установлены activemq и spring boot. Вам следует подумать о создании этого примера приложения, которое воспроизводит вашу проблему. - person Just another Java programmer; 19.12.2018