【发布时间】:2014-03-14 03:38:00
【问题描述】:
我遇到需要排空 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 这个值。假设我们在队列中有一个非常快的生产者,设置一个 500 毫秒的超时似乎有点武断。我们可能会无限循环(即生产者每 500 毫秒产生 >= 1 条消息)
替代方法是使用receiveNoWait()。据我了解,这会在消息可用时提取消息,或者返回 null,而不涉及超时。但是,根据THIS文章:
如果您调用 receiveNoWait(),并非所有 JMS 提供程序都会立即返回消息,并且代理上可能有消息,因此值得等待一秒钟左右,以确保队列确实已耗尽。
那么有没有更稳健的方法可以通过程序化方法来做到这一点?或者,Tibco EMS 管理员是否有排水功能?
【问题讨论】:
标签: java jms message-queue tibco tibco-ems