【问题标题】:IBM Websphere MQ Publisher Confirms and Consumer Acknowledgement, .NET clientIBM Websphere MQ Publisher Confirms 和 Consumer Acknowledgement,.NET 客户端
【发布时间】:2018-09-03 09:17:33
【问题描述】:

.NET 客户端中的 IBM Websphere MQ 是否支持以下功能?请提供代码示例。

1.发布者确认

当发布者向队列发送消息时,它会从 MQ 服务器收到消息已保存到硬盘的确认。

MQ 服务器发送确认前是否保存消息?

更新 2

当 MQQueue.Put() 返回时,消息是否已保存到事务日志中是否正确?保存到磁盘需要多长时间?集群中的消息持久性如何?

     void PutMessage(byte[] messageString)
    {
        try{

            // creating a message object
            message = new MQMessage();
            message.Write(messageString);
            message.Format = MQC.MQFMT_STRING;
            message.CharacterSet = 1208;// IbmUtf8Encoding;
            message.Persistence = MQC.MQPER_PERSISTENT;

            var options = new MQPutMessageOptions
            {
                Options = useSyncPoint ? MQC.MQPMO_SYNCPOINT : MQC.MQPMO_NO_SYNCPOINT
            };

            queue.Put(message, options);
            qMgr.Commit();

        }catch(Exception e){
            qMgr.Backout();
        }
    }

2。消费者确认

当消费者从队列接收到消息,处理它们,然后向 MQ 服务器发送确认。

更新 3

Consumer 如何向 MQ 服务器确认消息已成功处理,并且可以安全地从服务器中删除消息?

public void GetMessages()
    {            
        Open(ConnectionMode.Read);

        for (int i = 1; i <= numberOfMsgs; i++)
        {             
            GetMessage();
        }
        queue.Close();
        queueManager.Disconnect();         
    }

    public string GetMessage()
    {
        message = new MQMessage { Format = MQC.MQFMT_STRING };
        var mqMessageOptions = new MQGetMessageOptions
        {           
            Options = MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_SYNCPOINT
        };

        queue.Get(message, mqMessageOptions, MaxMessageSizeInBytes);

        var content = message.ReadString(message.MessageLength);
        message.ClearMessage();

        return content;
    }


public void Open(ConnectionMode websphereConnectionMode)
    {
        var connectionSettings = new Hashtable
        {
            {MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED },
            {MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT }
        };

        int openOptions = 0;

        switch (websphereConnectionMode)
        {
            case ConnectionMode.Read:
                openOptions = MQC.MQOO_INPUT_SHARED + MQC.MQOO_FAIL_IF_QUIESCING;
                break;
            case ConnectionMode.Write:
                openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
                break;
        }
        queueManager = new MQQueueManager(queueManagerName);
        queue = queueManager.AccessQueue(queueName, openOptions);
    }


    public enum ConnectionMode
    {
        Read,
        Write
    }

How to do an explicit ACK when receiving Websphere MQ messages?

【问题讨论】:

  • 您需要提交才能完成,当提交返回时,它会被写入磁盘。消息在消息的生命周期内保持持久性,因此当通过经典或集群通道跳转到其他队列管理器时,它将沿途持久化到磁盘。
  • 你能说得更具体点吗?
  • 我建议您下载 MQ Advanced for Developers 并自己尝试这些东西。您已经修改了您的问题以包含应该包含三个不同问题的内容。 @AttilaRepasi 回答了您提出的原始问题。
  • 然后您对其进行了修改以提出第二个更具体的问题,@Roger 回答了该问题。现在您已经修改它以提出第三个问题,每个问题都应该是不同的问题,Stackoverflow 应该是每个帖子一个问题/答案。
  • 我没有改变我原来的问题。有与问题1相关的问题,例如它包括集群,需要澄清。如果它很容易回答,它就会得到回答。这些都是有价值的问题,对其他读者有帮助。

标签: .net ibm-mq


【解决方案1】:

到目前为止,您更新的代码是正确的,但是您缺少 MQ 提交或回退。您的代码需要告诉 MQ UOW(工作单元)是完整的还是不适当的。 即

qMgr.Commit();

qMgr.Backout();

【讨论】:

  • 如何标记工作单元的开始?请检查我更新的代码以验证它是否正确?任何代码示例都将不胜感激。
  • 为什么没有一个 IBM 代码示例使用 Commit() 或 Backout()? C:\Program Files\IBM\WebSphere MQ\Tools\dotnet\samples\cs\base\ 这是否意味着所有这些示例都是一种即发即弃的交付,除了那些使用事务的示例?
  • 代码看起来与我 4 小时前发布时没有任何不同。 UOW 在您使用 MQC.MQPMO_SYNCPOINT 选项发出 Put() 时开始,并以提交或回退结束。使用 UOW 的全部意义在于代码正在做两件或多件你想捆绑在一起的事情。即数据库更新和 MQ 放置。如果你没有做两件不同的事情,那么不要使用 UOW。
  • 发布者向代理发送消息至少有两种情况。 1 当发布者想知道broker已经收到消息时,发布者希望最好(即发即弃) 2 除了1之外,broker已经存储了消息,并且发布者获得了更好的消息传递保证。我该如何编写这些场景?
  • 首先,“for (int i = 1; i mqtechconference.com
【解决方案2】:
  1. 如果消息是持久化的,那么 MQ 会将其写入事务日志,并等待日志范围到达磁盘,然后 put 返回。

  2. 为此,消费者应在同步点下读取消息,并在客户端完成适当处理后提交获取。

【讨论】:

  • 你的意思是一旦 MQQueue.Put() 返回,消息已经被保存到事务日志?保存到磁盘需要多长时间?集群中的消息持久性如何?
  • 非常感谢任何链接。
  • 我找不到第 2 点的代码示例。有什么想法吗? ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/…
  • 是的,如果将消息设置为持久化(message.Persistence = MQC.MQPER_PERSISTENT;),它会在 Put 返回之前保存在磁盘上,因此无需等待任何确认。这同样适用于集群,您的消息将持久保存在您连接的 QM 上,并以持久的方式在整个集群中传输。
  • 在集群上,仔细检查,所以消息会在Put返回之前保存到集群中的所有服务器?在这种情况下,Put 可能需要一段时间才能返回?
猜你喜欢
  • 1970-01-01
  • 2016-12-14
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多