IBM MQ JMS Java 侦听器代码保持程序运行



这个问题是所问问题的延续 IBM MQ 侦听器 服务 - 未触发消息

假设相同的代码在生产中,现在我们如何保持程序运行。 我觉得添加扫描程序代码不是实现它的正确或有效方法。 有没有更好的解决方案来保持程序运行,所以当到达主程序结束时,程序不会退出。 理想情况下,我认为启动方法qc.start()调用应该无限期等待。 请让我知道我们如何以适当和理想的方式实施这一点。

要求是侦听器应无限期地运行,等待新消息。 我没有任何其他业务条件可以放入main方法以保持程序运行。添加扫描程序代码似乎不是一个好方法。 理想的方式是什么?

我认为您要问的是如何使Java程序无限期地运行。

有几种方法,但您确实需要一种方法来终止它,无论是通过用户中断还是信号,并且您不希望它处于紧密循环中,因此它将消耗所有 CPU 和堆栈内存,不会为您的onMessage事件留下任何内容。

您不想让onMessage进入睡眠状态,因此它应该在辅助线程中生成,从而允许主线程定期从睡眠中唤醒以检查 终止信号。

基础知识是


Thread worker = new Thread(new yourOnMessageThread());
worker.start();
while(true) {
try {
Thread.sleep(sleep duration);
} catch(InterruptedException ex) {
// check for termination signal
// if required, terminate
}
}

请注意,JMS 附带了 2 种消息调度方法:同步与异步。对于初学者,如果您的程序不必执行任何操作,除非有新消息,请先尝试同步调度。您无需创建和设置侦听器对象:

consumer = queueSession.createConsumer(queue); 
qc.start();
while( nummsgs<maxmsgs || maxmsgs==0 ) {
Message message = consumer.receive(1000); // receive the next message or wait up to 1 second, for example
if (message != null) {
nummsgs++;
... processing code ...
}
}

(我通常喜欢根据输入参数(如int maxmsgs = 0;(制作 while 的结束条件,这样您就可以在处理 100000 条消息后自动停止,例如用于性能测试,或者只是指定 0 以使其永久运行(。

这种方法没有错,因为代码更容易编写和理解,所以我建议将其作为第一级方法。主循环只是 MQ 调度程序循环,如果这是程序的主要目的,这是有意义的。

如果您的程序执行许多操作,其中之一是 MQ 接收,则异步调度可能会更好。主循环不再有"MQ 焦点"。它只是坐在那里等到有人按 Ctrl-C 或终止程序。

consumer = queueSession.createConsumer(queue);
Listener listener = new Listener();
consumer.setMessageListener(listener);
qc.start();
Object waitLock = new Object();
while( nummsgs<maxmsgs || maxmsgs==0 ) {
synchronized(waitLock) {
waitLock.wait(1000); // wait up to 1 second, for example
}
}

最新更新