Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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
C# 如何处理WebSphere队列上订阅的连接失败?_C#_Ibm Mq - Fatal编程技术网

C# 如何处理WebSphere队列上订阅的连接失败?

C# 如何处理WebSphere队列上订阅的连接失败?,c#,ibm-mq,C#,Ibm Mq,当.net windows服务连接到Websphere MQ队列进行订阅并不断读取消息时,我们如何处理诸如网络断开或发生错误之类的问题,我们能否始终依赖MQQueueManager.IsConnected属性?这篇文章让我感到困惑: 下面是我必须从队列读取消息的代码,我使用的是MQ版本8.0 private MQQueueManager _queueManager; private MQQueue _queue; private MQTopic _topic; public bool isSub

当.net windows服务连接到Websphere MQ队列进行订阅并不断读取消息时,我们如何处理诸如网络断开或发生错误之类的问题,我们能否始终依赖
MQQueueManager.IsConnected
属性?这篇文章让我感到困惑:

下面是我必须从队列读取消息的代码,我使用的是MQ版本8.0

private MQQueueManager _queueManager;
private MQQueue _queue;
private MQTopic _topic;
public bool isSubscribed = false;

public void Subscribe()
{
    var queueManagerName = "myQueueManager";
    var properties = new Hashtable();
    //Set all the properties here
    _queueManager = new MQQueueManager(queueManagerName, properties);

    //Conect to Queue
    _queue = _queueManager.AccessQueue("devQueue", MQC.MQOO_INPUT_AS_Q_DEF);

    isSubscribed = true;
    while (isSubscribed)
    {
        if (cancellationToken.IsCancellationRequested)
        {
            isSubscribed = false;
            cancellationToken.ThrowIfCancellationRequested();
        }
        try
        {
            Receive(onMessageReceived);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception: {0}", ex);
        }
    }   
}


public override void Receive<T>(Action<T> onMessageReceived)
{
    try
    {
        var dataReceived = new MQMessage();
        _queue.Get(dataReceived);

        T message;
        message = (T)(object)dataReceived;

        onMessageReceived(message);     
        _queueManager.Commit();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
专用MQQueueManager\u queueManager;
专用MQQueue\u队列;
私有MQTopic\u主题;
public bool isSubscribed=false;
公开无效订阅()
{
var queueManagerName=“myQueueManager”;
var properties=newhashtable();
//在此处设置所有属性
_queueManager=新的MQQueueManager(queueManagerName,属性);
//连接到队列
_queue=_queueManager.AccessQueue(“devQueue”,MQC.MQOO_INPUT_AS_Q_DEF);
IssuSubscribed=true;
while(已订阅)
{
if(cancellationToken.IsCancellationRequested)
{
IssuSubscribed=假;
cancellationToken.ThrowIfCancellationRequested();
}
尝试
{
接收(onMessageReceived);
}
捕获(例外情况除外)
{
WriteLine(“异常:{0}”,ex);
}
}   
}
公共覆盖无效接收(操作onMessageReceived)
{
尝试
{
var dataReceived=new MQMessage();
_Get(dataReceived);
T消息;
消息=(T)(对象)接收到的数据;
onMessageReceived(消息);
_queueManager.Commit();
}
捕获(例外情况除外)
{
掷骰子;
}
}

您链接到的APAR IC75673已在MQ 7.0.1.6版中修复,该版本已发布。mqv8.0已经发布。一般来说,MQ先前版本中的任何修复也将在新版本中修复

您的应用程序是否连接到运行该应用程序的同一Windows服务器上的队列管理器?在代码中,您没有指定主机名、端口、通道名称等表示您正在通过网络使用MQ客户端连接的内容。您可能正在使用MQSERVER或MQCHLLIB/MQCHLTAB环境变量提供连接详细信息

如果您的应用程序与队列管理器建立本地连接,则它使用的是所谓的“绑定模式”,不依赖于网络。“断开连接”方法可以很好地指示您仍处于连接状态。文档中指出,如果您的连接处于空闲状态,则提供的状态是上次执行活动(Get、Put等)时的最后一个已知状态


如果您的应用程序正在通过网络建立MQ客户端连接,则客户端注意到断开连接所需的时间取决于队列管理器和MQ客户端之间协商的HBINT。对于.NET,似乎需要使用MQ通道表来设置此值@Morag Hughson对StackOverflow问题“”的回答提供了更多细节。您还可以查看我对StackOverflow问题“”的回答,了解有关HBINT如何影响客户端通道超时的更多详细信息。

您链接到的APAR IC75673已在发布的MQ版本7.0.1.6中修复。mqv8.0已经发布。一般来说,MQ先前版本中的任何修复也将在新版本中修复

您的应用程序是否连接到运行该应用程序的同一Windows服务器上的队列管理器?在代码中,您没有指定主机名、端口、通道名称等表示您正在通过网络使用MQ客户端连接的内容。您可能正在使用MQSERVER或MQCHLLIB/MQCHLTAB环境变量提供连接详细信息

如果您的应用程序与队列管理器建立本地连接,则它使用的是所谓的“绑定模式”,不依赖于网络。“断开连接”方法可以很好地指示您仍处于连接状态。文档中指出,如果您的连接处于空闲状态,则提供的状态是上次执行活动(Get、Put等)时的最后一个已知状态

如果您的应用程序正在通过网络建立MQ客户端连接,则客户端注意到断开连接所需的时间取决于队列管理器和MQ客户端之间协商的HBINT。对于.NET,似乎需要使用MQ通道表来设置此值@Morag Hughson对StackOverflow问题“”的回答提供了更多细节。您还可以查看我对StackOverflow问题“”的回答,了解有关HBINT如何影响客户端通道超时的更多详细信息