为 IBM MQ 设置超时
Setting timeout for IBM MQ
当我调用 com.ibm.mq.MQQueue#put(MQMessage,MQPutMessageOptions)
时,它可能会挂起。如何为此方法设置超时?
同样的问题是 com.ibm.mq.MQQueue#get(MQMessage,MQGetMessageOptions)
有 MQGMO_WAIT 选项和 WaitInterval 可以设置为使 Get 调用等待一定时间。例如,以下代码段使 Get 调用等待 3 秒。
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.Options = MQConstants.MQGMO_WAIT;
gmo.WaitInterval = 3000;
mqQueue.Get(mqMessage, gmo);
虽然没有为 Put 调用设置超时的选项。如果有任何问题,Put 调用 returns 会出错。
更新:
调用 Put 调用时,已建立与队列管理器的连接。如果连接有任何问题,Put 调用会在 TCP 堆栈通知此类问题后立即得到 returns。由于此类 TCP 级别问题影响系统上的所有应用程序 运行,在我看来,调整必须在系统级别而不是在每个应用程序级别进行。另外我认为不可能为 socket.write 调用设置超时。
MQ 确实提供了一种设置超时的方法来建立与队列管理器的连接。 mqclient.ini中有connection_timeout参数可以设置超时。
对于 MQ v7.0 及更高版本,使用 SHARECNV 为 1 或更高的 SVRCONN 通道,您可以缩短 IBM MQ 类 用于 Java 或 IBM MQ [=32] 所需的时间=] 通过将 SVRCONN 的 HBINT 设置为较低的值,将 JMS return 由于网络问题导致的 PUT 错误。 TIMEOUT 基于 HBINT 使用以下公式:
- 如果 HBINT 小于 60: HBINT * 2
- 如果HBINT大于等于60:HBINT + 60
SVRCONN 通道上的默认 HBINT 是 300 秒,因此您最终会超时 6 分钟。我喜欢将它设置为一个较低的值,例如 15,这会给您 30 秒的超时时间。
IBM MQ 类 for Java 和 IBM MQ 类 for JMS 在以编程方式或通过 JNDI 指定连接详细信息时采用在队列管理器的 SVRCONN 通道上设置的 HBINT。
如果你指向一个通道table Java/JMS 将使用通道table的CLNTCONN HBINT,最终的HBINT将是CLNTCONN 和 SVRCONN 之间的最大值。例如,如果 CLNTCONN 通道设置为 15,SVRCONN 设置为默认值 300,则最终的 HBINT 将为 300。
当我调用 com.ibm.mq.MQQueue#put(MQMessage,MQPutMessageOptions)
时,它可能会挂起。如何为此方法设置超时?
同样的问题是 com.ibm.mq.MQQueue#get(MQMessage,MQGetMessageOptions)
有 MQGMO_WAIT 选项和 WaitInterval 可以设置为使 Get 调用等待一定时间。例如,以下代码段使 Get 调用等待 3 秒。
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.Options = MQConstants.MQGMO_WAIT;
gmo.WaitInterval = 3000;
mqQueue.Get(mqMessage, gmo);
虽然没有为 Put 调用设置超时的选项。如果有任何问题,Put 调用 returns 会出错。
更新:
调用 Put 调用时,已建立与队列管理器的连接。如果连接有任何问题,Put 调用会在 TCP 堆栈通知此类问题后立即得到 returns。由于此类 TCP 级别问题影响系统上的所有应用程序 运行,在我看来,调整必须在系统级别而不是在每个应用程序级别进行。另外我认为不可能为 socket.write 调用设置超时。
MQ 确实提供了一种设置超时的方法来建立与队列管理器的连接。 mqclient.ini中有connection_timeout参数可以设置超时。
对于 MQ v7.0 及更高版本,使用 SHARECNV 为 1 或更高的 SVRCONN 通道,您可以缩短 IBM MQ 类 用于 Java 或 IBM MQ [=32] 所需的时间=] 通过将 SVRCONN 的 HBINT 设置为较低的值,将 JMS return 由于网络问题导致的 PUT 错误。 TIMEOUT 基于 HBINT 使用以下公式:
- 如果 HBINT 小于 60: HBINT * 2
- 如果HBINT大于等于60:HBINT + 60
SVRCONN 通道上的默认 HBINT 是 300 秒,因此您最终会超时 6 分钟。我喜欢将它设置为一个较低的值,例如 15,这会给您 30 秒的超时时间。
IBM MQ 类 for Java 和 IBM MQ 类 for JMS 在以编程方式或通过 JNDI 指定连接详细信息时采用在队列管理器的 SVRCONN 通道上设置的 HBINT。
如果你指向一个通道table Java/JMS 将使用通道table的CLNTCONN HBINT,最终的HBINT将是CLNTCONN 和 SVRCONN 之间的最大值。例如,如果 CLNTCONN 通道设置为 15,SVRCONN 设置为默认值 300,则最终的 HBINT 将为 300。