TL;DR 我正在使用 IBM.XMS,当我ISession.Close
在网络故障期间调用时,该方法永远不会返回 - 即使网络已重新建立。
我正在使用 IBM.XMS从 WMQ读取(即获取)消息。在测试期间,我们通过删除客户端和主机之间的网络连接来强制断开与 WMQ 的连接。发生这种情况时,任何 PUT 消息的尝试都会引发异常,从而强制 a Close
on ISession
。
伪代码
ISession session;
IDestination destination;
IConsumer consumer;
try
{
session = GetSession(connection);
destination = GetDestination(session);
consumer = GetConsumer(destination);
while (hasMessage)
{
// process message
}
}
catch
{
session.Close(); // waits forever
}
这将永远锁定我的处理线程,而不是在一段时间后超时和/或抛出异常(假设没有网络)。
我也设置了重新连接IConnection
:
connectionFactory.SetIntProperty(XMSC.WMQ_CLIENT_RECONNECT_OPTIONS, XMSC.WMQ_CLIENT_RECONNECT_Q_MGR);
connectionFactory.SetStringProperty(XMSC.WMQ_CONNECTION_NAME_LIST, $"{hostName}({port})");
connectionFactory.SetIntProperty(XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT, XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT_DEFAULT);