【问题标题】:XMS.Net 2.1.0.0/1 CWSMQ0282EXMS.Net 2.1.0.0/1 CWSMQ0282E
【发布时间】:2018-07-10 08:47:16
【问题描述】:

我们正在使用 XMS.Net 连接到 WebSphere MQ 服务器 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 但无济于事...

编辑

这是我所看到的:

This is my trace log(抱歉,无法在此处添加,因为我的消息长度将超过 30000 个字符),here 是更详细的日志(traceSpecification “all”而不是“debug”)。

我还尝试将(测试)应用程序切换到 .Net V2.0.50727.5456,但这也无济于事。

编辑

我似乎已将其范围缩小到“空”的 CoA 和 CoD;当使用 MQRO_COA_WITH_DATA 或 MQRO_COA_WITH_FULL_DATA(与 CoD 相同)而不是 MQRO_COA 发送消息时,不会发生 CWSMQ0282E 错误。所以 XMS.Net 似乎在 CoA 和 CoD 的空体上崩溃了。我需要确认一些事情,以确保它不是由我的项目中的其他东西干扰造成的,但我很确定这是原因。

【问题讨论】:

    标签: c# .net ibm-mq


    【解决方案1】:

    异常似乎是因为收到的消息没有消息正文。如果收到的消息是由于 MQRO_COD 或 MQRC_COA 选项(在发送原始消息时设置)将没有任何消息正文。当 XMS 试图处理没有任何正文的消息时,它就会遇到麻烦。

    我很困惑在使用 MQ v6 时这是如何工作的。您可能需要检查发送原始消息的应用程序是否已延迟更改。

    同样为了让 XMS 处理任何消息,传入消息必须包含所需的 JMS 标头。 MQRO_COD/MQRO_COA 由队列管理器自动生成,不会包含 JMS 标头。

    关于上面代码sn-p的其他几点建议:

    1) IPEndpoint 的实例并不是真正需要的。您可以简单地将主机名或 IP 地址设置为字符串,将端口号设置为整数。

    2) 连接WMQ时无需设置XMSC.RTT_BROKER_PING_INTERVAL

    3) 由于您在创建会话时使用了AcknowledgeMode.AutoAcknowledge,因此无需在OnMessageReceived方法中调用message.Acknowledge()

    【讨论】:

    • 1) 使用 IPEndpoint 是因为我从一个更大的项目中提取了代码;将更改测试应用程序,但不会改变任何功能 2)将删除,但恐怕也不会解决任何问题 3)这被错误地解除了;它实际上是 ClientAcknowledge 我会回到你的帖子的其余部分。
    • 在 V6 中运行良好; OnMessageReceived 检查正在接收的消息类型(实际消息或报告 (CoA/CoD))。我省略了 OnMessageReceived 的实现,因为它甚至没有被调用; XMS.Net 应该 调用该函数,但它在调用它之前崩溃。发送应用程序没有改变(因为我们自己的应用程序是发送方)。我将更新上面的代码以反映您建议的更改,并显示更多的 OnMessageReceived 实现(尽管它并不重要,因为它没有被调用)。
    • 我已经更新了示例/测试代码。无论如何,无论错误是什么,您是否同意至少“收到的消息”行应写入控制台?我看到的是“...blablablah 开始,按任意键...”,然后是 BOOM(因为队列中有 CoA/CoD)。当我手动删除 CoA/CoD 消息时,应用程序启动正常。使用 MQ Explorer 将“测试消息”放在队列上处理得很好(“收到消息”,然后是其余的实现)。再说一遍:这在 V6 中可以正常工作。
    • 要让 XMS 向应用程序传递消息,该消息必须包含某些标头。如果它们不存在,则消息将被路由到 DLQ 或 BOQ。在您的情况下,CoA/CoD 消息没有正文或任何标头。因此,如果已定义消息,则该消息应该已进入死信队列或退出队列。这里可能有一个错误。当前,您的应用程序使用 XMSC.WMQ_CM_CLIENT_UNMANAGED 作为连接模式。您可以尝试将连接模式更改为 XMSC.WMQ_CM_CLIENT_MANAGED 并查看情况如何。最好与 IBM 开一个 PMR 以获得明确的答案。
    • 我正在使用 WMQ_CM_CLIENT_UNMANAGED 因为this。此外,没有 WMQ_CM_CLIENT_MANAGED as far as I can see 或找到 at IBM。注释掉该行(例如使用默认设置)会导致“CWSMQ0006E:在调用 ConnectionFactory.CreateConnection 方法期间收到异常:IBM.WMQ.Nmqi.NmqiException:'IBM.WMQ.Nmqi.NmqiException' 类型的异常”被抛出。Blahblah 原因代码 2538"(主机不可用???)。我无法通过 IBM 打开 PMR,因为我只是客户“端点/最终用户”。
    【解决方案2】:

    据我所知,这个异常确实发生在“空”CoA 和 CoD 上。当使用MQRO_COA_WITH_DATA / MQRO_COD_WITH_DATA(甚至更大的MQRO_COA_WITH_FULL_DATA / MQRO_COD_WITH_FULL_DATA)发送消息时,不会发生异常。我们将向 IBM 提交“PMR”以确认。

    【讨论】:

    • @roblll 你能回答一下这个案子的结局吗?我们在这里遇到了同样的错误。
    猜你喜欢
    • 2015-10-06
    • 2015-09-13
    • 1970-01-01
    • 2019-02-09
    • 2015-09-11
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    相关资源
    最近更新 更多