Java 设置IBM MQ的超时
当我调用Java 设置IBM MQ的超时,java,ibm-mq,Java,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 MQGe
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调用将返回一个错误
更新:
调用Put调用时,已建立到队列管理器的连接。如果连接存在任何问题,则在TCP堆栈通知此类问题后,Put调用将立即返回。由于此类TCP级别的问题会影响系统上运行的所有应用程序,因此我认为,必须在系统级别进行调优,而不是在每个应用程序级别进行调优。另外,我认为不可能为socket.write调用设置超时
MQ确实提供了一种设置超时的方法,用于建立到队列管理器的连接。mqclient.ini中有connection_timeout参数,您可以设置超时。对于MQ v7.0和更高版本,使用SHARECNV为1或更高的SVRCONN通道,您可以通过设置将SVRCONN设置为较低的值。超时基于HBINT,使用以下公式:
- 如果HBINT小于60:HBINT*2
- 如果HBINT大于或等于60:HBINT+60
如果指向通道表Java/JMS将使用通道表的CLNTCONN HBINT,则最终HBINT将是CLNTCONN和SVRCONN之间的最高值。例如,如果CLNTCONN通道设置为15,而SVRCONN设置为默认值300,则最终HBINT将为300。因此Put可能至少会挂起TCP超时?没有办法使它比TCP超时时间更短吗?