【发布时间】:2014-12-18 14:37:48
【问题描述】:
我想从队列中读取第一条 MQ 消息(不删除它)并将这条消息保存到我的数据库中。然后,如果一切都完成了,我需要将此消息从 MQ 队列中永久删除。我所知道的只是删除队列中的第一条消息。但是我如何知道我保存到数据库中的同一条消息是否与我将从 MQ 中删除的同一条消息相同?
谢谢, 迈克尔
编辑: 现在尝试在 C#(控制台应用程序)中使用 TransactionScope 处理操作:
using (TransactionScope scope = new TransactionScope){
//MQ Connection ( read message of queue)
Hashtable properties = new Hashtable();
properties.Add(MQC.HOST_NAME_PROPERTY, _settings.MQServer);
properties.Add(MQC.PORT_PROPERTY, _settings.MQPort);
properties.Add(MQC.CHANNEL_PROPERTY, _settings.MQChannelName);
properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_XACLIENT);
MQQueueManager _MQHandler = new MQQueueManager(_settings.MQManager, properties);
MQQueue = _MQHandler.AccessQueue(ReceiveQueueName,
MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING);
MQQueueMessage = new MQMessage();
MQQueueMessage.Format = MQC.MQFMT_STRING;
MQQueueGetMessageOptions = new MQGetMessageOptions();
MQQueueGetMessageOptions.Options += MQC.MQGMO_SYNCPOINT; //new
MQQueue.Get(MQQueueMessage, MQQueueGetMessageOptions);
//DB Connection (save message in database)
if ( DBsuccess ) {
_MQHandler.Commit();
scope.Complete();
}else{
_MQHandler.Backout();
}
}
这似乎是我想要的:) 但有些问题: - 如果我在 Put/Get 处创建一个同步点,然后调用 Backout(),MQ 是否只会回滚到该同步点? - 如果消息是工作单元,MQ 是否被其他 MQ 管理器阻塞?
【问题讨论】:
-
您应该考虑使用 XA 事务而不是手动进行。
-
所以在我的理解中......重复问题的答案锁定了队列,以便只允许一次访问,或者?
-
@Gas 你有使用 mq 进行 XA 交易的例子吗?