如何在接收器类中使用选择器过滤JMS消息

时间:2019-02-20 16:03:02

标签: java spring spring-boot jms spring-jms

我想从队列中使用消息,该消息在队列中存在3分钟以上。

下面是我的消费类。如何在选择器中定义条件。

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

}

1 个答案:

答案 0 :(得分:1)

选择器必须类似于:

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

但是,选择器是在基础JMS使用者创建时设置的,并且是不可变的,因此,由于时间总是在向前发展,因此该选择器将迅速“过时”增长。要更改选择器,将需要关闭现有使用者并使用新选择器创建一个新使用者。显然,在这种情况下,Spring正在处理使用者的创建并设置选择器,因此您要么需要删除Spring而是自己使用JMS API(这并不困难)。

另一种可能的解决方案是将消息的生存时间设置为3分钟,并在您正在使用的任何代理上定义一个到期队列,并从该到期队列而不是主要消息中定义消耗量,因为所有消息到期队列中的邮件将被保证已经在主队列中至少存在3分钟。