.net - IBM Websphere MQ 发布者确认和消费者确认,.NET 客户端

标签 .net ibm-mq

.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

消费者如何向 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 会将其写入事务日志并等待日志范围到达磁盘,然后 put 返回。
  • 为了实现这一点,消费者应该在同步点下读取消息,并在客户端完成适当的处理后提交获取。
  • 关于.net - IBM Websphere MQ 发布者确认和消费者确认,.NET 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49470950/

    相关文章:

    .net - 为什么我收到 MQRC_NO_MSG_AVAILABLE?

    python - IBM MQ python3 模块?

    java - 用于 Websphere MQ 连接定义的 Wildfly 资源适配器

    c# - 修复 RegEx Split() 函数 - 空字符串作为第一个条目

    c# - 提交,显示结果,延迟 3 秒并重定向

    c# - 询问 ActiveDirectory 计算机是否是组的成员

    c# - 使用代码切换到 TabControl 中的选项卡

    c# - WCF 服务主机关闭被打开的 session 阻止并且设置 receiveTimeout 没有帮助

    delphi - MQSeries 和德尔福

    java - UTF 到 EBCDIC 的转换是无损的吗?