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

标签 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);

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

我的问题涉及这个超时值。假设队列中有一个非常快的生产者,设置 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/

相关文章:

jms - 什么是外国 JMS 提供者? Weblogic 在 JMS 应用程序中的典型作用是什么?

ssl - 使用 7.1 jar 的 WMQ SSL 高可用性 JMS 连接出现错误

c - 不同的Linux消息队列有相同的id?

java - 如何在互联网连接断开但 WiFi 仍连接时收到通知

java - 如何通过BufferedOutputStream写入文件?

java - 是否可以在没有 JNDI 的情况下将 HornetQ 用作 bean(即使它在某种抽象之后)...?

linux - POSIX 消息队列 linux

java - Gradle - 如何获取 ivy XML 文件

java - 用于登录 S3 的 Log4j appender

delphi - Firemonkey - 消息处理