【问题标题】:WebSphere MQ check string with mq message带有 mq 消息的 WebSphere MQ 检查字符串
【发布时间】: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 管理器阻塞?

【问题讨论】:

标签: c# ibm-mq mq


【解决方案1】:

所以为了澄清一些术语,消息在队列上,而不是通道上 - 通道只是让您访问队列管理器。因此,实际上您想要“获取”第一条消息(在使用 GMO_SYNCPOINT 的工作单元内),将其存储到数据库中,如果存储有效,则从队列中删除消息(通过提交)。为此,您将在一个工作单元中从队列中获取消息,并且同时仅“提交”获取(即使其发生)和数据库更新。一般来说,您将使用事务协调来确保数据库更新和获取都发生(提交)或都不发生(回滚)。希望您可以使用 o/s DTC(分布式事务协调器)使 MQ 和数据库都参与同一个事务 - 您还需要查看是否需要托管或非托管连接,因为它们是不同的实现 - 请参阅信息中心http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q029290_.htm

【讨论】:

  • 我查看了上面的链接,现在对如何处理这个问题有了更好的了解,谢谢!我将队列与 C# 控制台应用程序连接起来。所以它是非托管代码,对吧?你有 C# 中的事务示例吗?
  • MQ .net 库可以建立连接并将数据直接传输到完全在 .net 环境中的 MQ 系统(托管),或者它可以通过普通 C 客户端进行 MQI 调用(非托管,默认) .从历史上看,非托管是功能齐全的,而非托管则不那么重要,尽管随着时间的推移,它们更接近了。 www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/… 及其子页面讨论了它是如何工作的
  • 嗨,您正在浏览(将消息留在那里),然后保存您收到的消息,然后破坏性地将消息放在队列的前面。这既非常危险(如果您运行 2 个应用程序副本来扩展它,它们都会保存第一条消息,并丢弃 2 条消息)和额外的调用......查看 MQGMO_SYNCPOINT。 make 先用gmo_syncpoint获取一个GET,然后保存在工作单元下的数据库中。然后你提交或回滚。如果您提交,则“get”会破坏消息,如果您回滚,则“get”将被撤消,并且消息将放回队列中。
猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 2010-09-21
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多