3

XMS.Netを使用してWebSphereMQサーバーV7に接続しています。これはV6サーバーでは常に正常に機能していましたが、「相手」がV7にアップグレードされたため、問題が発生しました。そのほとんどは修正されましたが、今では説明できないエラーに遭遇しました。また、次のことについても何も見つかりません。

CWSMQ0282E: A null value has been used for argument BUFFER = <> NULL within method ImportMQMDMesageBuffer(WmqSession, WmqDestination, MQMD,byte[],int,int).
The preceding method detected an invalid  null argument.
If necessary, recode the application to avoid the error condition.
Stacktrace:    at IBM.XMS.Client.WMQ.WmqReceiveMarshal.ImportMQMDMesageBuffer(MQMessageDescriptor mqmd, Byte[] buffer, Int32 dataStart, Int32 dataEnd)
   at IBM.XMS.Client.WMQ.WmqAsyncConsumerShadow.Consumer(Phconn hconn, MQMessageDescriptor mqmd, MQGetMessageOptions mqgmo, Byte[] pBuffer, MQCBC mqcbc)
   at IBM.WMQ.Nmqi.UnmanagedNmqiMQ.NmqiConsumerMethodUM(Int32 hconn, IntPtr structMqmd, IntPtr structMqgmo, IntPtr buffer, IntPtr structMqcbc)

このエラーの原因について私が知っていると思う唯一のことは、メッセージを送信したことであり、CoAおよびCoDメッセージを期待しています。これらがキューにあることを期待しており、これらのメッセージをリッスンしているコンシューマーをシャットダウンすると、残りは正常に機能します。

何が起こっているのか全くわかりません...

編集

これは最小限のテストケースです。

using System;
using System.Configuration;
using System.Text;
using IBM.XMS;

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //Setup unhandled exception "logging"
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

            //Change this to your own needs!
            string QueueManager = "CONTOSO";
            string Channel = "MYCOMPANY.CONTOSO.TCP";
            string Queue = "MYCOMPANY.REPORTQ";
            string HostIP = "192.168.1.29"
            int Port = 1416;

            //Create connection
            var factoryfactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
            var connectionfactory = factoryfactory.CreateConnectionFactory();

            connectionfactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, QueueManager);
            connectionfactory.SetStringProperty(XMSC.WMQ_HOST_NAME, HostIP);
            connectionfactory.SetIntProperty(XMSC.WMQ_PORT, Port);
            connectionfactory.SetStringProperty(XMSC.WMQ_CHANNEL, Channel);
            connectionfactory.SetIntProperty(XMSC.WMQ_BROKER_VERSION, XMSC.WMQ_BROKER_V2);
            connectionfactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT_UNMANAGED);

            var connection = connectionfactory.CreateConnection();
            connection.ExceptionListener = new ExceptionListener(OnXMSExceptionReceived);

            //Create session
            var session = connection.CreateSession(false, AcknowledgeMode.ClientAcknowledge);

            //Create consumer
            var queue = session.CreateQueue(string.Format("queue://{0}/{1}", QueueManager, Queue));
            queue.SetIntProperty(XMSC.WMQ_TARGET_CLIENT, XMSC.WMQ_TARGET_DEST_MQ);  //Prevent automatic RFH (or JMS) headers in messages...
            var consumer = session.CreateConsumer(queue);
            consumer.MessageListener = new MessageListener(OnMessageReceived);  //Messages received will be handled by OnMessageReceived

            //Start the connection (which starts the consumer to listen etc.)
            Console.WriteLine("Starting");
            connection.Start();
            Console.WriteLine("Started; press any key to stop");

            //Now we wait...
            Console.ReadKey();

            //Tear down the connection
            Console.WriteLine("Stopping");
            connection.Stop();
            Console.WriteLine("Stopped; press any key to end application");

            //Keep the console around
            Console.ReadKey();
        }

        private static void OnMessageReceived(IMessage message)
        {
            Console.WriteLine("Message received");
            if (message is IBytesMessage)
            {
                var bytesmsg = (IBytesMessage)message;
                var data = new byte[bytesmsg.BodyLength];
                Console.WriteLine(Encoding.UTF8.GetString(data));
            }
            else
            {
                //The message is not an IBytesMessage, check to see if it is a Feedback-type message
                if (message.PropertyExists(XMSC.JMS_IBM_FEEDBACK))
                {
                    //Figure out which type of feedback message this is
                    int feedback = message.GetIntProperty(XMSC.JMS_IBM_FEEDBACK);
                    switch (feedback)
                    {
                        case MQC.MQFB_COA:
                            Console.WriteLine("COA received");
                            break;
                        case MQC.MQFB_COD:
                            Console.WriteLine("COD received");
                            break;
                        default:
                            //Unknown feedback type
                            Console.WriteLine("Unknown feedback");
                            break;
                    }
                }
                else
                {
                    //The message is not a feedback message; we don't know what this is so it's unexpected.
                    Console.WriteLine("Unexpected message received");
                }
            }

            Console.WriteLine("Acknowledging");
            message.Acknowledge();
            Console.WriteLine("Acknowledged");
        }

        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            //Uh oh
            Console.WriteLine("*** UnhandledException ***");
            Console.WriteLine((e.ExceptionObject as Exception).Message);
            Console.WriteLine("******************************");
        }

        private static void OnXMSExceptionReceived(Exception ex)
        {
            //Uh oh
            Console.WriteLine("*** OnXMSExceptionReceived ***");
            Console.WriteLine(ex.Message);
            Console.WriteLine("******************************");
        }
    }
}

新しい(コンソール)プロジェクトを作成し、IBM.XMS.dll(C:\ Program Files(x86)\ IBM \ WebSphere MQ \ Tools \ Lib \ IBM.XMS.dll)への参照を追加して、プロジェクトを実行します。メッセージをレポートキューに入れて、何が起こるかを確認します。

V6サーバーに接続すると、すべてが正常になり、V7では例外がスローされます。

また、2.1.0.1にアップデートしようとしましたが、役に立ちませんでした...

編集

これが私が見ているものです: さらにいくつかの書き込み行を追加しましたが、クラッシュは明らかです

これは私のトレースログです(メッセージの長さが30000文字を超えるため、ここに追加できません)。さらに詳細なログがあります(traceSpecificationは「debug」ではなく「all」です)。

また、(テスト)アプリケーションを.Net V2.0.50727.5456に切り替えてみましたが、それも役に立ちません。

編集

私はそれを「空の」CoAとCoDに絞り込んだようです。メッセージがMQRO_COAではなくMQRO_COA_WITH_DATAまたはMQRO_COA_WITH_FULL_DATA(CoDでも同じ)で送信される場合、CWSMQ0282Eエラーは発生しません。そのため、XMS.NetはCoAとCoDの空のボディでクラッシュするようです。プロジェクト内の他のものが干渉していることが原因ではないことを確認するためにいくつかのことを確認する必要がありますが、これが原因であると確信しています。

4

2 に答える 2

0

私がこの例外を判断できる限り、実際、「空の」CoAとCoDで発生します。メッセージがMQRO_COA_WITH_DATA/ MQRO_COD_WITH_DATA(またはさらにかさばるMQRO_COA_WITH_FULL_DATA/ MQRO_COD_WITH_FULL_DATA)で送信される場合、例外は発生しません。確認のため、IBMに「PMR」を提出します。

于 2012-06-28T10:57:26.050 に答える
0

例外は、受信したメッセージにメッセージ本文がないためと思われます。受信したメッセージがMQRO_CODまたはMQRC_COAオプション(元のメッセージが送信されたときに設定された)のいずれかが原因である場合、メッセージ本文はありません。XMSが本文なしでメッセージを処理しようとすると、問題が発生します。

MQv6を使用したときにこれがどのように機能していたかについては戸惑っています。元のメッセージを送信しているアプリケーションが遅れて変更されていないかどうかを確認することをお勧めします。

また、XMSがメッセージを処理するには、着信メッセージに必要なJMSヘッダーが含まれている必要があります。MQRO_COD / MQRO_COAは、キュー・マネージャーによって自動的に生成され、JMSヘッダーは含まれません。

上記のコードスニペットに関する他のいくつかの提案:

1)のインスタンスは実際にIPEndpointは必要ありません。ホスト名またはIPアドレスを文字列として設定し、ポート番号を整数として設定するだけです。

2)XMSC.RTT_BROKER_PING_INTERVALWMQを接続するときに設定する必要はありません。

3)セッションの作成中に使用したので、メソッドAcknowledgeMode.AutoAcknowledgeを呼び出す必要はありません。message.Acknowledge()OnMessageReceived

于 2012-06-15T06:12:06.423 に答える