JMS Pub / Sub Вопросы - PullRequest
       35

JMS Pub / Sub Вопросы

0 голосов
/ 18 декабря 2018

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

Сценарий 1:

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

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

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

Сценарий 2:

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

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

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

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

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

Сценарий 1:

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

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

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

Сценарий 2:

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

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

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

Код моего производителя:

@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;
}
 

1 Ответ

0 голосов
/ 18 декабря 2018

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

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

Производитель сообщений должен быть постоянным:

messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
...