当MQ服务器收到Put()请求时,哪些因素会影响存储消息?以下是潜在因素:
1)在内存中缓存消息一段时间,或
2)收到一定数量的消息时
3)当收到消息的某个字节阈值时
4)MQ服务器立即为每条消息保存它。
更新
也就是说,当Put()返回时,消息是否已根据上述因素保存到硬盘或缓存中?
非常感谢任何有关官方文档的信息和链接。
以下是使用Put()的简单方案。
void PutMessages()
{
Open(ConnectionMode.Write);
// putting messages continuously
for (int i = 1; i <= numberOfMsgs; i++)
{
PutMessage(GetMessageInBytes(i));
}
queue.Close();
queueManager.Disconnect();
}
void PutMessage(byte[] messageString)
{
// creating a message object
message = new MQMessage();
message.Write(messageString);
message.Format = MQC.MQFMT_STRING;
message.CharacterSet = 1208;// IbmUtf8Encoding;
message.Persistence = MQC.MQPER_PERSISTENT;
var options = new MQPutMessageOptions
{
Options = false ? MQC.MQPMO_SYNCPOINT : MQC.MQPMO_NO_SYNCPOINT
};
queue.Put(message, options);
}
public void Open(ConnectionMode connectionMode)
{
var connectionSettings = new Hashtable
{
{MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED },
{MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT }
};
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;
}
queueManager = new MQQueueManager(queueManagerName);
queue = queueManager.AccessQueue(queueName, openOptions);
}
public enum ConnectionMode
{
Read,
Write
}
答案 0 :(得分:0)
在IBM MQ v9知识中心页面&#34; Application design and performance considerations&#34;它有这两个说:
将持久性消息放在同步点
下持久性消息应该放在同步点下。这是 因为在同步点之外获取持久性消息时,如果是 得到失败,应用程序无法知道是否 已经从队列中获取了消息,以及是否,如果是 消息已经得到,然后它也已经丢失。什么时候来 同步点下的持久性消息,如果有任何失败,则 事务被回滚,持久性消息不会丢失 因为它仍然在队列中。同样,当持久性 消息,将它们放在同步点下。放和的另一个原因 在同步点下获取持久性消息是持久性的 IBM MQ中的消息代码针对同步点进行了大量优化。所以推杆 在同步点下获取持久性消息比放置更快 并在同步点之外获取持久性消息。
但是,在外部放置和获取非持久性消息会更快 同步点,因为IBM MQ中的非持久代码已经过优化 在同步点之外。 放置并获取持久性消息 以磁盘速度运行,因为持久性消息持久存在 磁盘。 但是,放入和获取非持久性消息的时间是 CPU速度,因为没有涉及磁盘写入,甚至没有 使用同步点。
如果某个应用程序正在收到消息而且事先并不知道 无论是否持久,GMO选项 可以使用MQGMO_SYNCPOINT_IF_PERSISTENT。
来自IBM的Chris Frank在Capitalware's MQ Technical Conference v2.0.1.6发表了题为“{3}}的演讲 More Mysteries of the IBM MQ Distributed Logger, Slide&#34;如果我不使用交易怎么办? (2)&#34;第87页说明:
- 与不使用Syncpoint对比:
- 每个MQPut将导致至少一次对日志文件的物理写入
- 在此期间将阻止推送应用程序