【问题标题】:IBM MQSeries Accessing Issue from .NET来自 .NET 的 IBM MQSeries 访问问题
【发布时间】:2010-02-02 10:38:07
【问题描述】:

我对 IBM MQSeries 不是很熟悉,但我正在编写 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();
}

【问题讨论】:

  • 你知道为什么你的第一行缩进与其他行不同吗?这很没有吸引力。

标签: c# accessibility tcp ibm-mq


【解决方案1】:

Squig 很接近,但没有雪茄。当您打开队列时,如果您想同时读取和写入消息,则需要在打开选项上指定输入 输出。示例代码仅指定了输入选项。

【讨论】:

    【解决方案2】:

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

    queuePutMessageOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING
    

    是你所缺少的。

    【讨论】:

    • 看跌消息选项为 MQPMO_,未平仓选项为 MQOO_,您将两者混合使用。
    【解决方案3】:

    也许看看CodeProject上的这篇文章,关于MSMQ协议,文章实现了一个聊天系统。

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • 这是 MSMQ,我说的是 IBM MQSeries
    • @wtfudge:哦,对不起……真烦人!也许编辑您的问题以强调 IBM MQSeries 而不是 MSMQ 可能会更好...不要将两者混淆...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多