Мы используем ActiveMQ Artemis в JBoss EAP 7.1.
Мы заметили, что однажды сообщение с указанным значением c _AMQ_DUPL_ID
проходит через очередь, если производитель сообщений пытается отправить сообщение с тем же значением _AMQ_DUPL_ID
в ту же очередь снова удаляется посредником. Однако нам нужно отбросить повторяющиеся сообщения, только если они все еще находятся в очереди.
Есть ли способ достичь этой цели?
Мы используем первичный ключ из базы данных как _AMQ_DUPL_ID
ценность. Это код, который мы используем
public void sendMessage(final T msg, final String id) {
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
Message message = session.createObjectMessage(msg);
message.setStringProperty("_AMQ_DUPL_ID", id);
return message;
}
});
}
Мы ищем решение, потому что у нас есть таймер, который каждые 30 секунд загружает из БД все записи с указанным значением c для status и помещает их в очередь JMS.
Потребители принимают сообщения JMS, обрабатывают их, обновляют свое поле status , вставляют / обновляют их в БД и открывают соединение через веб-сокет с другим приложением что мы не контролируем. Иногда потребитель зависает при вызове веб-сокета и, следовательно, он остается занятым, в то время как таймер продолжает заполнять очередь.
Чтобы решить эту проблему, мы думали, что что-то вроде обнаружения дублирующихся сообщений Artemis поможет. Однако когда внешнее приложение зависает у нашего потребителя, нам нужен таймер, чтобы снова поставить сообщение в очередь.