Java 如何使用快速生产者正确地排出队列?

Java 如何使用快速生产者正确地排出队列?,java,jms,message-queue,tibco,tibco-ems,Java,Jms,Message Queue,Tibco,Tibco Ems,在这种情况下,我需要排空JMS(特别是Tibco EMS)队列。使用案例是,如果我们要进行一次大的中断,队列将建立起来,处理它将花费太长的时间。因此,我们希望排出队列,并执行coldstart类型的例程以获取当前状态 到目前为止,我要做的代码如下: int count = 0; Message msg = null; while ((msg = connection.receive(timeout)) != null) { count++; }

在这种情况下,我需要排空JMS(特别是Tibco EMS)队列。使用案例是,如果我们要进行一次大的中断,队列将建立起来,处理它将花费太长的时间。因此,我们希望排出队列,并执行coldstart类型的例程以获取当前状态

到目前为止,我要做的代码如下:

 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 admin是否附带一个排水功能

在TIBCO EMS管理中,您只需发出命令即可

PURGE QUEUE <queue name>
清除队列
删除其中的所有邮件。对于多个队列,您可以执行以下操作

PURGE ALL QUEUES <pattern using '>' and '*' as wildcards>
清除所有队列

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

在TIBCO EMS管理中,您只需发出命令即可

PURGE QUEUE <queue name>
清除队列
删除其中的所有邮件。对于多个队列,您可以执行以下操作

PURGE ALL QUEUES <pattern using '>' and '*' as wildcards>
清除所有队列

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

在TIBCO EMS管理中,您只需发出命令即可

PURGE QUEUE <queue name>
清除队列
删除其中的所有邮件。对于多个队列,您可以执行以下操作

PURGE ALL QUEUES <pattern using '>' and '*' as wildcards>
清除所有队列

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

在TIBCO EMS管理中,您只需发出命令即可

PURGE QUEUE <queue name>
清除队列
删除其中的所有邮件。对于多个队列,您可以执行以下操作

PURGE ALL QUEUES <pattern using '>' and '*' as wildcards>
清除所有队列

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

如果消息在特定时间段后不再需要,则可以设置消息的到期时间。这将确保消息在到期后离开队列。除了到期之外,还可以使用带有超时的简单receive()调用。如果队列中有消息,Receive将工作。如果消息处于未提交状态或被某个进程锁定,则只有接收呼叫才能获取该消息。

如果在特定时间段后不需要该消息,则可以设置消息的过期时间。这将确保消息在到期后离开队列。除了到期之外,还可以使用带有超时的简单receive()调用。如果队列中有消息,Receive将工作。如果消息处于未提交状态或被某个进程锁定,则只有接收呼叫才能获取该消息。

如果在特定时间段后不需要该消息,则可以设置消息的过期时间。这将确保消息在到期后离开队列。除了到期之外,还可以使用带有超时的简单receive()调用。如果队列中有消息,Receive将工作。如果消息处于未提交状态或被某个进程锁定,则只有接收呼叫才能获取该消息。

如果在特定时间段后不需要该消息,则可以设置消息的过期时间。这将确保消息在到期后离开队列。除了到期之外,还可以使用带有超时的简单receive()调用。如果队列中有消息,Receive将工作。如果消息处于未提交状态或被某个进程锁定,则只有接收调用才能获取该消息