Java 如何使用快速生产者正确地排出队列?
在这种情况下,我需要排空JMS(特别是Tibco EMS)队列。使用案例是,如果我们要进行一次大的中断,队列将建立起来,处理它将花费太长的时间。因此,我们希望排出队列,并执行coldstart类型的例程以获取当前状态 到目前为止,我要做的代码如下: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++; }
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将工作。如果消息处于未提交状态或被某个进程锁定,则只有接收调用才能获取该消息