设置IBM MQ的超时

时间:2016-12-08 13:36:31

标签: java ibm-mq

当我致电com.ibm.mq.MQQueue#put(MQMessage,MQPutMessageOptions)时,它可能会挂起。如何为此方法设置超时? 同样的问题是com.ibm.mq.MQQueue#get(MQMessage,MQGetMessageOptions)

2 个答案:

答案 0 :(得分:3)

使用MQRC7N及更高版本,使用SHARECNV为1或更高的SVRCONN通道,可以缩短Java MQ类或JMS的IBM MQ类在PUT上返回错误所需的时间通过将SVRCONN的HBINT设置为较低值来解决网络问题。 TIMEOUT基于HBINT,使用以下公式:

  • 如果HBINT小于60:HBINT * 2
  • 如果HBINT大于或等于60:HBINT + 60

SVRCONN频道上的默认HBINT为300秒,因此最终会超时6分钟。我喜欢将它设置为较低的值,例如15,这会给你30秒的超时。

用于Java的IBM MQ类和用于JMS的IBM MQ类在以编程方式或通过JNDI指定连接详细信息时采用队列管理器的SVRCONN通道上的HBINT集。

如果指向通道表,Java / JMS 使用通道表的CLNTCONN HBINT,则最终的HBINT将是CLNTCONN和SVRCONN之间的最高值。例如,如果CLNTCONN通道设置为15且SVRCONN设置为默认值300,则最终HBINT将为300.

答案 1 :(得分:2)

可以设置MQGMO_WAIT选项和WaitInterval,以使Get调用等待一段时间。例如,以下代码段使Get调用等待3秒。

        MQGetMessageOptions gmo = new MQGetMessageOptions();
        gmo.Options = MQConstants.MQGMO_WAIT;
        gmo.WaitInterval = 3000;

        mqQueue.Get(mqMessage, gmo);

虽然没有为Put调用设置超时的选项。如果有任何问题,Put调用将返回错误。

<强>更新

调用Put调用时,已建立与队列管理器的连接。如果连接存在任何问题,则当TCP堆栈通知此类问题时,Put调用会立即返回。因此,TCP级别问题会影响系统上运行的所有应用程序,在我看来,调优必须在系统级别完成,而不是在每个应用程序级别完成。另外我认为没有可能为socket.write调用设置超时。

MQ确实提供了一种为建立与队列管理器的连接设置超时的方法。 mqclient.ini中有connection_timeout参数可以设置超时。