C# IBM MQ.NET异步发送消息并提交()

C# IBM MQ.NET异步发送消息并提交(),c#,ibm-mq,C#,Ibm Mq,我尝试使用下面的代码验证异步Put()和Commit()的使用速度。问题是它的速度比仅使用异步Put()或仅使用Commit()慢十倍,这是没有意义的 我是不是遗漏了什么 class AsyncProducerWithCommit { private MQQueueManager _queueManager; private MQQueue _queue; public void Run() {

我尝试使用下面的代码验证异步
Put()
Commit()
的使用速度。问题是它的速度比仅使用异步
Put()
或仅使用
Commit()
慢十倍,这是没有意义的

我是不是遗漏了什么

class AsyncProducerWithCommit 
    {
        private MQQueueManager _queueManager;
        private MQQueue _queue;

        public void Run()
        {
            Produce();
        }


        void Produce()
        {
            Open(ConnectionMode.Write);

            PutMessage(ConvertMessageToByte(message)); 

            _queue.Close();
            _queueManager.Disconnect();
        }

        void PutMessage(byte[] messageString)
        {          
            MQMessage _message = new MQMessage();
            _message.Write(messageString);
            _message.Format = MQC.MQFMT_STRING;
            _message.CharacterSet = 1208;// IbmUtf8Encoding;
            _message.Persistence = MQC.MQPER_PERSISTENT;

            var putMessageOptions = new MQPutMessageOptions();
            putMessageOptions.Options  =  MQC.MQPMO_SYNCPOINT    //unit of work
                                          + MQC.MQPMO_ASYNC_RESPONSE;  //async

            _queue.Put(_message, putMessageOptions); //send message asynchronously

             _queueManager.Commit();   

        }

        void Open(ConnectionMode connectionMode)
        {
            string _queueManagerName = _appSetting.MessagingServerSetting.QueueManagerName;

            int openOptions = 0;

            switch (connectionMode)
            {
                case ConnectionMode.Read:
                    openOptions = MQC.MQOO_INPUT_SHARED + MQC.MQOO_FAIL_IF_QUIESCING;
                    break;
                case ConnectionMode.Write:
                    openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
                    break;
            }


            var properties = new Hashtable
            {
                {MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED },
                {MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT },
                { MQC.HOST_NAME_PROPERTY, "192.168.1.10" },
                { MQC.PORT_PROPERTY, "1415"},
                { MQC.CHANNEL_PROPERTY, "LOCAL.DEF.SVRCONN" },
                {MQC.USER_ID_PROPERTY, "user" },
                {MQC.PASSWORD_PROPERTY, "pwd" }               
            };

            _queueManager = new MQQueueManager(_queueManagerName, properties);
            _queue = _queueManager.AccessQueue(QUEUE_NAME, openOptions);
        }


        public enum ConnectionMode
        {
            Read,
            Write
        }

    }
更新1

异步输入

 putMessageOptions.Options  =  MQC.MQPMO_ASYNC_RESPONSE;  //async
_queue.Put(_message, putMessageOptions); //send message asynchronously
作出承诺

 putMessageOptions.Options  =  MQC.MQPMO_SYNCPOINT;    //unit of work                                         
  _queue.Put(_message, putMessageOptions); 
 _queueManager.Commit(); 
QueueManager版本:Redhat Linux 7上的8.0.0.5+


MQ.NET:8.0.0.8

在IBM MQ v8知识中心页面中,它声明:

通常,当应用程序将一条或多条消息放入队列时, 使用MQPUT或MQPUT1,应用程序必须等待队列 管理器确认它已处理MQI请求。你可以 提高消息传递性能,特别是对于使用 客户机绑定,以及放置大量小数据的应用程序 将消息发送到队列,方法是选择放置消息 异步的。当应用程序异步放置消息时, 队列管理器不返回每个调用的成功或失败,但 您可以改为定期检查错误

异步put只影响put调用,put调用将立即返回,而不是等待队列管理器确认它已处理put

因此,如果您具有以下功能,它将是最快的,因为您将永远不会等待消息写入磁盘

_message.Persistence = MQC.MQPER_PERSISTENT;
putMessageOptions.Options  =  MQC.MQPMO_ASYNC_RESPONSE;  //async
_queue.Put(_message, putMessageOptions); //send message asynchronously
如果您有这两种情况之一,提交将等待消息写入磁盘,因此速度将与磁盘写入速度一样慢。这很可能比上面的速度慢,但3秒对30秒似乎不合理

_message.Persistence = MQC.MQPER_PERSISTENT;
putMessageOptions.Options  =  MQC.MQPMO_SYNCPOINT    //unit of work
                            + MQC.MQPMO_ASYNC_RESPONSE;  //async
_queue.Put(_message, putMessageOptions); //send message asynchronously
_queueManager.Commit();


如果具有MQPMO_SYNCPOINT和MQPMO_ASYNC_响应的调用为30秒,而仅具有MQPMO_SYNCPOINT的调用为3秒,然后我认为一定存在某种缺陷,我建议您与IBM一起打开PMR,他们可能会要求您同时提供至少一个客户端.NET跟踪和可能的队列管理器跟踪。

您使用的是哪个mq队列管理器版本和.NET dll版本?异步put只影响put调用,put调用将立即返回,而不是等待qmgr以成功或失败进行响应。能否显示程序的三个版本并提供每个版本的时间?请参阅更新1。同样,它的速度是OP中提到的速度的十倍(例如3秒对30秒),这是相对的。另一个问题是MQ.NET:8.0.0.8比MQ.NET:8.0.0.5慢。有什么想法吗?例如,3秒对5秒的回复。如何使用IBM打开PMR?请提供此链接?如果可能,是否可以提供指向您提供的解释的链接?添加了对IBM KC的参考。PMR将根据贵公司与IBM签订的支持合同与IBM一起开放。有一个名为SR的在线网站可以让你这样做,但你必须有一个IBM客户号和一个有权打开这些请求的IBM ID:@pingpong如果你有更多问题,请告诉我。我两天前将帖子标记为答案,不确定为什么它不起作用。我现在又做了一次。
_message.Persistence = MQC.MQPER_PERSISTENT;
putMessageOptions.Options  =  MQC.MQPMO_SYNCPOINT;    //unit of work                                         
_queue.Put(_message, putMessageOptions); 
_queueManager.Commit();