我的情况是我需要耗尽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管理员附带的排水功能吗?
答案 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()调用。如果队列中有消息,则接收将起作用。如果消息处于非提交状态或被某个进程锁定,则只有接收呼叫才能获得该消息。