我遇到需要排空 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,而不涉及超时。但是,根据这篇文章:
如果您调用 receiveNoWait() 并且代理上可能有消息,并非所有 JMS 提供程序都会立即返回一条消息,因此值得等待一秒钟左右,以确保队列确实已耗尽。
那么有没有更强大的方法可以从程序化方法中做到这一点?或者,Tibco EMS 管理员是否有排水功能?