Как отфильтровать JMS-сообщение с помощью селектора в классе получателя - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу получить сообщение из очереди, которое присутствует в очереди более 3 минут.

Ниже приведен мой класс для потребления.Как определить условие в селекторе.

@Async
@JmsListener(destination = "jms/xyz" ,containerFactory = "xyzfactory", selector = "JMSTimestamp= 'morethan 3 minuts'")
public void xyzRecive(Message message) throws JMSException {

}

1 Ответ

0 голосов
/ 20 февраля 2019

Селектор должен быть примерно таким:

"JMSTimestamp > " + (System.currentTimeMillis() + 180000);

Однако селектор устанавливается на базовом потребителе JMS при его создании и является неизменяемым, поэтому этот селектор быстро устареет со временемвсегда движется вперед.Для изменения селектора потребуется закрыть существующего потребителя и создать нового потребителя с новым селектором.Очевидно, что в этом случае Spring обрабатывает создание потребителя и устанавливает селектор, поэтому вам нужно либо отказаться от Spring и использовать JMS API самостоятельно (что не сложно).

Другое потенциальное решение будетустановить время жизни сообщения 3 минуты и определить очередь экспирации для любого брокера, которого вы используете, и потребление из этой очереди экспирации вместо основного, поскольку все сообщения в очереди истечения будут гарантированнобыли в главной очереди не менее 3 минут.

...