Как определить дубликаты сообщений при добавлении в очередь Activemq - PullRequest
0 голосов
/ 14 мая 2019

Я устанавливаю JMS, используя ActiveMq в приложении весенней загрузки.Но не может понять, как запретить отправителю (провайдеру сообщений) добавлять дубликаты сообщений в очередь.

Первоначальная конфигурация компонентов JMS и компонентов преобразования сообщений моего приложения выглядит следующим образом

@Bean
    public Queue queue() {
        return new ActiveMQQueue("pendingDocuments.queue");
    }


@Bean 
 public MessageConverter jacksonJmsMessageConverter() {
       MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
            converter.setTargetType(MessageType.TEXT);
            converter.setTypeIdPropertyName("_type");
            return converter;
        }

Реализация метода отправителя

@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;

@Autowired
private Queue pendingDocumentsQueue;

public void getPendingDocuments(){

/*My Custom Java Object, Actually these objects will read from DB for every 5 min, so process no way to know either these are already added to queue or not*/

Document document= new Document();
document.setUniqueId("122212");
document.setContent("TEST CONTENT");
this.jmsMessagingTemplate.convertAndSend(this.pendingDocumentsQueue, document);

        }

Я хотел бы знать, как мы можем добавить сообщения (мой объект документа) в очередь на основе уникального идентификатора документа.

1 Ответ

0 голосов
/ 20 мая 2019

Если я правильно понимаю, вы пытаетесь помешать вашему сообщению обрабатывать повторяющиеся сообщения даже в случае сбоев?

Обычно у вас не должно быть дубликатов (ActiveMQ не создает их «самостоятельно»), но если вы думаете о возможных точках отказа (сбой отправителя, сбой брокера, сбой потребителя), вы 'Вы увидите, что Отправитель и Брокер не могут принять решение о «дублировании», если потребитель не сообщит им о последнем фактически обработанном сообщении.

Это может произойти с помощью внутреннего ACK от потребителя к брокеру (предотвращает пропущенные сообщения, но не дублирует) или с помощью транзакций JMS, которые также могут предотвратить дублирование.Если вы заставите своего отправителя и потребителя использовать транзакционные сеансы с jmsTemplate.setSessionTransacted(true); (см. Здесь) , у вас будет дубликат бесплатной связи с протоколом, подобным следующему:

  1. Проверка отправителя изпостоянное хранилище (может быть БД), каков следующий уникальный идентификатор.
  2. Отправитель отправляет сообщение.
  3. Отправитель фиксирует транзакцию и в то же время записывает обработку этого уникального идентификатора.
  4. Брокер доставит это сообщение с уникальным идентификатором транзакции.
  5. Клиент получит сообщение,
  6. Потребитель обрабатывает этот уникальный идентификатор и одновременно совершает транзакцию.
...