使用 IBM mq 正确停止 java 应用程序

Correct stop java application with IBM mq

我将 java 应用程序与 IBM mq websphere 一起使用。当我杀死 mq 中的应用程序时,仍然有一些关于通道的信息。我不知道如何正确停止应用程序。

简而言之,我需要使用 mq 通道终止应用程序。因为当我重新启动应用程序时,它无法启动并抛出异常:

ERROR Failed to initialize Queue Channel.
com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: Failed to connect to queue manager 'TL4UZ8T' with connection mode '1' and host name 'mq4u-TL4UZ8T.lb.com(64424)'.

感谢您的帮助!

小伙子!为什么你必须杀死应用程序?你的意思是应用程序异常终止?

应用程序必须调用 Disconnect() 来通知队列管理器清理它的结束。这是一个最佳实践,请阅读其他最佳实践 here。如果未调用 Disconnect,队列管理器不会立即清除为客户端连接分配的资源。

因此请检查您的应用程序代码并确保它具有关闭任何 queues/topics/connections 打开的代码。

为了扩展 Shashi 的出色回答,您可以在此处考虑很多事情。例如:

  • 在 终止应用程序之前停止频道。即使您有数十个 运行 频道实例,您也可以停止与该特定 IP 地址关联的频道实例。使用 MODE(INACTIVE) 以便应用可以重新连接。
  • 终止应用程序后停止频道。和以前一样,您可以停止与该特定 IP 地址关联的那些。
  • 检测应用程序以接受队列中的关闭命令,然后自行关闭。
  • 禁用应用程序的队列。当一个应用程序没有很好地检测时,它很可能认为禁用它的队列是致命的,并且会在您这样做时自行关闭。
  • 调整通道的HBINTSHARECONVKEEPALIVE等参数,使通道有大量空闲实例,及时关闭孤立实例。这可能还包括增加听众积压。
  • 检测应用程序以接受 SIGHUP 或其他系统信号以正常关闭自身。

正如 Shashi 指出的那样,最好的选择是应用程序将其关闭的愿望传达给 QMgr,然后两者合作完成该任务。该应用程序旨在与 MQ 合作处理每个 其他 任务,那么为什么不是这个呢?

但是,如果这不是一个选项,请使用 MQ 中内置的工具来尽可能接近所需的结果。

否则,请使用 OS 中内置的工具,但调整 MQ 以将影响降至最低。