3

私は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);
}

私のエラーキャッチは私にエラーを与えます:

アプリケーションのエラー

もちろん、これはあまり表示されません。そこで、サーバーのイベントログを確認したところ、次のエラーが表示されました。

TCP / IPを介してstx041774(192.168.225.51)からデータを受信するとエラーが発生しました。これは、通信障害が原因である可能性があります。

TCP / IP(recv)呼び出しからの戻りコードは10054(X'2746')でした。これらの値を記録し、システム管理者に伝えてください。

私は10054を調べて、次のことを意味します。

既存の接続は、リモートホストによって強制的に閉じられました。

誰かが私がこの仕事をするために何ができるか考えていますか?書き込み用に設定する必要のあるMQCオプションはありますか?オプションをどうすればいいのかわからないので、これが問題なのかどうかさえわかりません。

私も毎回接続を閉じることを覚えておいてください:

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

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

3 に答える 3

1

メッセージを取得するときにgetオプションを設定するのと同じように、メッセージを配置するときにputオプションも設定する必要があります

queuePutMessageOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING

あなたの行方不明のものです。

于 2010-02-22T02:58:53.180 に答える
1

Squigは近くにありましたが、葉巻はありませんでした。キューを開くときに、メッセージの読み取りと書き込みの両方を行う場合は、開くオプションで入力と出力の両方を指定する必要があります。サンプルコードには、入力オプションのみが指定されています。

于 2010-08-04T03:23:15.340 に答える
-2

たぶん、 CodeProjectに関するこの記事を見て、MSMQプロトコルに関連して、この記事はチャットシステムを実装しています。

これがお役に立てば幸いです、よろしく、トム。

于 2010-02-02T11:18:16.187 に答える