gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:12:01 25 4
gpt4 key购买 nike

我遇到了一种情况,需要清空 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);

基本上,它会循环接收消息,直到超时到期,然后才收到消息,表明队列为空。

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

另一种方法是使用 receiveNoWait()。据我了解,如果消息可用,则拉取一条消息,或者返回 null,不涉及超时。然而,根据THIS文章:

Not all JMS providers return immediately with a message if you call receiveNoWait() and there may be messages on the broker, so its worth waiting a second or so just to be sure the queue really is drained.

那么有没有一种更强大的方法可以通过编程方法来做到这一点?或者,Tibco EMS admin 是否有排水功能?

最佳答案

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

PURGE QUEUE <queue name>

从中删除所有消息。对于多个队列,你可以这样做

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

请注意,除了 EMS Admin 的命令行界面之外,还有一个 Java-API 可以直接从 Java 程序内部发出此类管理命令。

关于java - 如何使用快速生产者正确排空队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21785073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com