我想从队列中读取第一条MQ消息(而不删除它(,并将此消息保存到我的数据库中。然后,如果一切都完成,我需要从 MQ 队列中永久删除此消息。我所知道的是,只是删除队列中的第一条消息。但是,我如何知道我保存到数据库中的同一消息是否与我将从 MQ 中删除的消息相同?
谢谢迈克尔
编辑:现在尝试使用 C#(控制台应用程序(中的事务范围处理操作:
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
因此,为了澄清一些术语,消息在队列上,而不是通道上 - 通道只是允许您访问队列管理器。因此,实际上您希望"获取"第一条消息(在具有GMO_SYNCPOINT的工作单元中(,将其存储到数据库中,如果存储有效,则从队列中删除消息(通过提交(。为此,您将从工作单元中的队列中获取消息,并且仅同时"提交"get(即使其发生(和数据库更新。一般来说,您将使用事务协调来确保数据库更新和获取都发生(提交(或两者都不发生(回滚(。希望您可以使用 o/s DTC(分布式事务协调器(使 MQ 和数据库参与同一事务 - 您还需要查看是否需要托管连接或非托管连接,因为它们是不同的实现 - 请参阅信息中心 http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q029290_.htm