Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置IBM MQ的超时_Java_Ibm Mq - Fatal编程技术网

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
SVRCONN通道上的默认HBINT为300秒,因此最终会出现6分钟的超时。我想把它设置为一个较低的值,比如15,它会给你30秒的超时时间

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


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

因此Put可能至少会挂起TCP超时?没有办法使它比TCP超时时间更短吗?