我想从队列中读取第一条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管理器?
答案 0 :(得分:3)
因此,为了澄清一些术语,消息在队列中,而不是通道 - 通道只允许您访问队列管理器。因此,实际上您希望“获取”第一条消息(在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