Могу ли я изменить JMSMessageID, чтобы гарантировать его уникальность? - PullRequest
0 голосов
/ 19 июня 2020

Я создаю приложение весенней загрузки с кластером серверов ActiveMQ. Чтобы решить проблему с дублированием сообщений на стороне потребителя, все исключенные из очереди JMSMessageID будут сохранены в redis, и потребитель будет игнорировать все новые сообщения с повторяющимися идентификаторами в redis.

Для этого Мне нужно, чтобы все JMSMessageID были уникальными. Я попытался установить JMSMessageID в коде производителя, но мне кажется, что я не могу его изменить. Мой вопрос заключается в том, что в распределенной системе (несколько серверов приложений и кластер серверов ActiveMQ) будет ли система, сгенерированная JMSMessageID, быть уникальной?

jmsTemplate.send(name, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
               Email email = new Email("l****@gmail.com", "this is test body", "test");
               ObjectMessage objectMessage = session.createObjectMessage();
               objectMessage.setJMSMessageID(customID);
               return objectMessage;
            }
         });

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

JMSMessageID устанавливается поставщиком JMS. Он не может быть установлен клиентом в соответствии со спецификацией JMS. JMS spe c действительно гарантирует уникальность JMSMessageID. В разделе 3.4.3 спецификаций JMS 1.1 и 2 сказано:

A JMSMessageID - это значение String, которое должно функционировать как уникальный ключ для идентификации сообщений в историческом репозитории. Точная область уникальности определяется поставщиком. Он должен, по крайней мере, охватывать все сообщения для конкретной c установки провайдера, где установка представляет собой некоторый подключенный набор маршрутизаторов сообщений.

0 голосов
/ 19 июня 2020

Отправить общее c сообщение GenericMessage(T payload, Map<String,Object> headers). Полезной нагрузкой будет ваш объект, а в заголовок вы можете ввести какое-то уникальное значение, с помощью которого вы можете однозначно идентифицировать сообщение.

  MessageHeaders headers = new MessageHeaders(Collections.<String, Object>singletonMap("foo", "some unique value"));
...