IBM MQSeries从.NET访问问题

时间:2010-02-02 10:38:08

标签: c# accessibility tcp ibm-mq

我对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。这可能是由于a   通讯失败。

     

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

我抬头看了10054,意思是:

  

强行建立现有连接   由远程主机关闭。

有谁知道我能做些什么来使这项工作?是否有一个我必须设置写入的MQC选项?因为我不知道如何处理选项,我甚至不确定这是否是问题。

请记住,我每次都关闭我的连接:

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

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

3 个答案:

答案 0 :(得分:1)

就像在获取消息时设置get选项一样,您还需要设置put 您发送消息时的选项

queuePutMessageOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING

是你失踪的。

答案 1 :(得分:1)

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

答案 2 :(得分:-2)

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

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