Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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# IBM MQSeries从.NET访问问题_C#_Accessibility_Tcp_Ibm Mq - Fatal编程技术网

C# IBM MQSeries从.NET访问问题

C# IBM MQSeries从.NET访问问题,c#,accessibility,tcp,ibm-mq,C#,Accessibility,Tcp,Ibm Mq,我对IBMMQSeries不是非常熟悉,但我正在编写c#脚本,用于从队列服务器写入和读取文件。问题是我的阅读效果好,但我的写作效果不好。请注意,我使用的是同一个队列,所以不要麻烦朝那个方向走 我的代码首先使用以下代码访问MQserver: MQQueueManager qManager; MQQueue queue; MQMessage queueMessage; MQGetMessageOptions queueGetMessageOptions; MQPutMessageOptions qu

我对IBMMQSeries不是非常熟悉,但我正在编写c#脚本,用于从队列服务器写入和读取文件。问题是我的阅读效果好,但我的写作效果不好。请注意,我使用的是同一个队列,所以不要麻烦朝那个方向走

我的代码首先使用以下代码访问MQserver:

MQQueueManager qManager;
MQQueue queue;
MQMessage queueMessage;
MQGetMessageOptions queueGetMessageOptions;
MQPutMessageOptions queuePutMessageOptions;

string QueueName;

public MQAccess(string queueName, string queueManager, string connection, string channel)
{
    QueueName = queueName;

    qManager = new MQQueueManager(queueManager, channel, connection);

    queue = qManager.AccessQueue(QueueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
}
我可以使用以下代码从队列中读取文件:

public bool NextMessage(ref string message, ref DateTime putDateTime)
{
    queueMessage = new MQMessage();
    queueMessage.Format = MQC.MQFMT_STRING;
    queueGetMessageOptions = new MQGetMessageOptions();

    queueGetMessageOptions.Options = MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING;

    try
    {
        queue.Get(queueMessage, queueGetMessageOptions);
    }
    catch (MQException mqex)
    {
        if (mqex.ReasonCode == MQC.MQRC_NO_MSG_AVAILABLE)
        {
            message = "";
            return false;
        }
        else
            throw mqex;
    }
    message = queueMessage.ReadString(queueMessage.MessageLength);
    putDateTime = queueMessage.PutDateTime;

    if (message.StartsWith("´╗┐"))
    {
        message = message.Substring(3, message.Length - 3);
    }

    return true;
}
但是,如果我尝试使用以下代码编写,则会出现错误:

public void WriteMessage(string message)
{
    queueMessage = new MQMessage();
    queueMessage.WriteString(message);
    queueMessage.Format = MQC.MQFMT_STRING;
    queuePutMessageOptions = new MQPutMessageOptions();

    queue.Put(queueMessage, queuePutMessageOptions);
}
我的错误捕获为我提供了错误:

应用程序中的错误

当然,这并没有太多的表现。因此,我检查了服务器上的事件日志,这向我显示了错误:

从接收数据时出错 stx041774(192.168.225.51)超过 TCP/IP。这可能是由于 通信故障

来自TCP/IP(recv)的返回代码 电话号码是10054(X'2746')。记录这些 价值观并告诉系统 管理员

我查了10054,意思是:

一个现有的连接被强制删除 由远程主机关闭

有人知道我能做些什么来让这一切顺利吗?我是否必须设置一个MQC选项以供编写?因为我不知道如何处理这些选项,我甚至不确定这是否是问题所在

请记住,我每次都会关闭与以下用户的连接:

public void Close()
{
    queueMessage = null;
    queue.Close();
    qManager.Close();
}

~MQAccess()
{
    queueMessage = null;
    queue.Close();
    qManager.Close();
}

也许可以看看这篇文章,关于MSMQ协议,这篇文章实现了一个聊天系统

希望这有帮助, 顺致敬意,
Tom。

正如在获取消息时设置get选项一样,您还需要设置put 当您放置消息时的选项

queuePutMessageOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING

这就是你所缺少的。

斯奎格离你很近,但没有雪茄。打开队列时,如果同时要读取和写入消息,则需要在“打开”选项中指定输入和输出。示例代码只指定了输入选项。

这是MSMQ,我说的是IBMMQSeries@wtfudge:哦,对不起……真糟糕!也许编辑您的问题时最好强调IBM MQSeries,而不是MSMQ…以免混淆两者…您知道为什么第一行缩进与其他行不同吗?这很不吸引人,put消息选项是MQPMO_uuu,open选项是MQOO_u,您将两者混合使用。