QPID:添加临时消息使用者以清除队列中未处理的消息

时间:2018-07-05 16:08:01

标签: spring-jms qpid spring-scheduled

我在持久QPID队列上有2个消息使用者。这些消息使用者是使用以下代码创建的(以下示例中我不包括异常处理,以保持话题):

class MessageConsumer {
    private Session session;
    private Queue queue;
    private final MessageListener listener;
    private final ConditionProvider condition; //can be used to modify the selection string if needed

    public MessageConsumer(ConnectionFactory connectionFactory, String queueName, MessageListener listener, ConditionProvider condition) {
            session = conn.createSession(false, Session.CLIENT_ACKNOWLEDGE);
            queue = session.createQueue(queueName);
    }
//Wakes up every minute and processes messages for the given condition
@Scheduled(fixedRateString = "60000", initialDelay = 1000)
public void listen() {
        if (messageConsumer != null) { 
            messageConsumer.close();
        }               
        messageConsumer = session.createConsumer(queue, condition.getCondition());
        messageConsumer.setMessageListener(listener);
    } 
    每当我想要更改用于查询队列的条件时,都会调用
  • listen()。当前,我在启动时实例化了MessageConsumer类的2个实例。提供的条件选择队列中低于和高于特定阈值的消息。阈值是在邮件头上设置的属性。第一个侦听器用于处理未达到特定阈值(错误率)的消息,而第二个侦听器将已达到阈值的消息移至另一个队列。目前,这两种方法都可以正常工作。

示例:

  • 消费者1-给我发送消息,其中阈值> = 0且阈值<10。然后,侦听器代码执行以下操作:如果无法处理它们,它将增加阈值并将其放回队列。
  • 消费者2-在阈值> 10时给我发送消息,然后将其放在其他队列中。

我现在想添加一个附加功能,即如果我知道未处理消息的原因已解决,则强制排空队列。

什么是有效的选择?

  • 停止现有消费者是否有意义?如果是这样,如何避免@Scheduled运行并耗尽队列后重新启动@Scheduled
  • 将新使用者添加到同一队列并获取所有消息?如何防止现有的消费者获取这些消息?
  • 更改现有使用者的条件,以在下一次计划的listen()运行中选择所有消息并耗尽所有消息?不知何故,这对我来说更具吸引力,因为它会处理前两个选项。 (将其中一个使用者使用的查询字符串设置为永远不会返回任何消息,而将另一个使用者使用的查询字符串设置为不返回队列中的所有消息。)

感谢您的帮助。

0 个答案:

没有答案