当我致电com.ibm.mq.MQQueue#put(MQMessage,MQPutMessageOptions)
时,它可能会挂起。如何为此方法设置超时?
同样的问题是com.ibm.mq.MQQueue#get(MQMessage,MQGetMessageOptions)
答案 0 :(得分:3)
使用MQRC7N及更高版本,使用SHARECNV为1或更高的SVRCONN通道,可以缩短Java MQ类或JMS的IBM MQ类在PUT上返回错误所需的时间通过将SVRCONN的HBINT设置为较低值来解决网络问题。 TIMEOUT基于HBINT,使用以下公式:
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参数可以设置超时。