IBM Websphere MQ 发布者确认和消费者确认,.NET 客户端
IBM Websphere MQ Publisher Confirms and Consumer Acknowledgement, .NET client
.NET 客户端中的 IBM Websphere MQ 是否支持以下功能?请提供代码示例。
1.出版商确认
当 Publisher 将消息发送到队列时,它会从 MQ 服务器收到消息已保存到硬盘的确认信息。
MQ服务器是否在发送确认前保存消息?
更新 2
当MQQueue.Put() returns时,消息已保存到事务日志中是否正确?保存到磁盘需要多长时间?集群中的消息持久化如何?
void PutMessage(byte[] messageString)
{
try{
// 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 = useSyncPoint ? MQC.MQPMO_SYNCPOINT : MQC.MQPMO_NO_SYNCPOINT
};
queue.Put(message, options);
qMgr.Commit();
}catch(Exception e){
qMgr.Backout();
}
}
2。消费者致谢
当消费者从队列中接收到消息,处理它们,然后向 MQ 服务器发送确认。
更新 3
Consumer 如何向 MQ 服务器确认消息已成功处理,并且可以从服务器安全地删除消息?
public void GetMessages()
{
Open(ConnectionMode.Read);
for (int i = 1; i <= numberOfMsgs; i++)
{
GetMessage();
}
queue.Close();
queueManager.Disconnect();
}
public string GetMessage()
{
message = new MQMessage { Format = MQC.MQFMT_STRING };
var mqMessageOptions = new MQGetMessageOptions
{
Options = MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_SYNCPOINT
};
queue.Get(message, mqMessageOptions, MaxMessageSizeInBytes);
var content = message.ReadString(message.MessageLength);
message.ClearMessage();
return content;
}
public void Open(ConnectionMode websphereConnectionMode)
{
var connectionSettings = new Hashtable
{
{MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED },
{MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT }
};
int openOptions = 0;
switch (websphereConnectionMode)
{
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
}
How to do an explicit ACK when receiving Websphere MQ messages?
如果消息是持久化的,那么MQ会将其写入事务日志,等待日志extent到达磁盘,然后再放入returns.
为此,消费者应在同步点下读取消息,并在客户端进行适当处理后提交获取。
到目前为止,您更新的代码是正确的,但您缺少 MQ 提交或撤销。您的代码需要告诉 MQ UOW(工作单元)已完成或未完成。
即
qMgr.Commit();
或
qMgr.Backout();
.NET 客户端中的 IBM Websphere MQ 是否支持以下功能?请提供代码示例。
1.出版商确认
当 Publisher 将消息发送到队列时,它会从 MQ 服务器收到消息已保存到硬盘的确认信息。
MQ服务器是否在发送确认前保存消息?
更新 2
当MQQueue.Put() returns时,消息已保存到事务日志中是否正确?保存到磁盘需要多长时间?集群中的消息持久化如何?
void PutMessage(byte[] messageString)
{
try{
// 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 = useSyncPoint ? MQC.MQPMO_SYNCPOINT : MQC.MQPMO_NO_SYNCPOINT
};
queue.Put(message, options);
qMgr.Commit();
}catch(Exception e){
qMgr.Backout();
}
}
2。消费者致谢
当消费者从队列中接收到消息,处理它们,然后向 MQ 服务器发送确认。
更新 3
Consumer 如何向 MQ 服务器确认消息已成功处理,并且可以从服务器安全地删除消息?
public void GetMessages()
{
Open(ConnectionMode.Read);
for (int i = 1; i <= numberOfMsgs; i++)
{
GetMessage();
}
queue.Close();
queueManager.Disconnect();
}
public string GetMessage()
{
message = new MQMessage { Format = MQC.MQFMT_STRING };
var mqMessageOptions = new MQGetMessageOptions
{
Options = MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_SYNCPOINT
};
queue.Get(message, mqMessageOptions, MaxMessageSizeInBytes);
var content = message.ReadString(message.MessageLength);
message.ClearMessage();
return content;
}
public void Open(ConnectionMode websphereConnectionMode)
{
var connectionSettings = new Hashtable
{
{MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED },
{MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT }
};
int openOptions = 0;
switch (websphereConnectionMode)
{
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
}
How to do an explicit ACK when receiving Websphere MQ messages?
如果消息是持久化的,那么MQ会将其写入事务日志,等待日志extent到达磁盘,然后再放入returns.
为此,消费者应在同步点下读取消息,并在客户端进行适当处理后提交获取。
到目前为止,您更新的代码是正确的,但您缺少 MQ 提交或撤销。您的代码需要告诉 MQ UOW(工作单元)已完成或未完成。 即
qMgr.Commit();
或
qMgr.Backout();