WebSphere MQ检查带有mq消息的字符串

时间:2014-12-18 14:37:49

标签: c# ibm-mq mq

我想从队列中读取第一条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管理器?

1 个答案:

答案 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