如何使用快速生产者正确排空队列?

时间:2014-02-14 16:53:16

标签: java jms message-queue tibco tibco-ems

我的情况是我需要耗尽JMS(特别是Tibco EMS)队列。用例是如果我们要进行大量停机,队列会建立并处理它需要太长时间。因此,我们希望排空队列,并执行冷启动类型例程以获取当前状态。

我到目前为止所做的代码如下:

 int count = 0;
    Message msg = null;
    while ((msg = connection.receive(timeout)) != null) {
        count++;
    }
    System.out.println(count + " msgs removed from queue: " + queueName);

基本上它会在收到消息之前循环接收消息,直到timeout到期,表明队列为空。

我的问题涉及timeout的这个值。假设我们在队列上有一个非常快的生产者,设置500ms的超时似乎有点武断。我们有可能无限循环(即生产者每500毫秒产生一次> = 1条消息)

另一种方法是使用receiveNoWait()。根据我的理解,这是一个消息,如果它可用,或者返回null,不涉及超时。但是,根据 THIS 文章:

  

如果您调用receiveNoWait()并且代理上可能存在消息,并非所有JMS提供程序都会立即返回消息,因此值得等待一秒左右,以确保队列真正耗尽。

那么从程序化方法中有更强大的方法吗?另外还有Tibco EMS管理员附带的排水功能吗?

2 个答案:

答案 0 :(得分:3)

在TIBCO EMS Admin中,您只需发出命令

即可
PURGE QUEUE <queue name>

从中删除所有邮件。对于多个队列,您可以执行

PURGE ALL QUEUES <pattern using '>' and '*' as wildcards>

请注意,除了EMS Admin的命令行界面外,还有一个Java-API直接从Java程序内部发出这样的Admin命令。

答案 1 :(得分:0)

如果在特定时间段后不需要该消息,您可以设置消息的到期日期。这将确保消息在到期后从队列中消失。除了到期之外,还可以使用带超时的简单receive()调用。如果队列中有消息,则接收将起作用。如果消息处于非提交状态或被某个进程锁定,则只有接收呼叫才能获得该消息。