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