【发布时间】:2018-10-10 00:02:37
【问题描述】:
我尝试使用以下代码验证同时使用异步 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
【问题讨论】:
-
您使用的是哪个 mq 队列管理器版本和 .net dll 版本?异步 put 仅影响将立即返回的 put 调用,而不是等待 qmgr 响应成功或失败。您能否展示您的程序的三个版本并提供每个版本的时间?
-
请参阅更新 1。同样,它比 OP 中提到的慢十倍(例如 3 秒 vs 30 秒),这是相对的。
-
另一个问题是 MQ.NET: 8.0.0.8 比 MQ.NET: 8.0.0.5 慢。任何想法?例如,3 秒 vs 5 秒