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



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

相关内容

  • 没有找到相关文章

最新更新