Azure服务总线订阅客户端.OnMessage总是在不应该完成的时候完成消息

本文关键字:不应该 消息 候完成 总线 服务 客户端 OnMessage Azure | 更新日期: 2023-09-27 18:10:45

我正在尝试接收给定订阅到服务总线主题的所有消息,但对于此应用程序的上下文,我不希望它们此时死信,我只想查看它们并将它们留在订阅上。尽管将客户端实例化为

SubscriptionClient sc = SubscriptionClient.CreateFromConnectionString(connectionString, sub.topicName, sub.subscriptionName, ReceiveMode.PeekLock);

并确保我使用的是message. abandon()而不是message. complete()在访问消息后消息总是变成死信。我也有选择。自动完成设置为false

完整方法代码如下:

public List<ServiceBusMessage> RetrieveSubscriptionMessages(Subscription sub) {
        ServiceBusMessage sbm;
        List<ServiceBusMessage> list = new List<ServiceBusMessage>();
        String connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"].ToString();
        SubscriptionClient sc = SubscriptionClient.CreateFromConnectionString(connectionString, sub.topicName, sub.subscriptionName, ReceiveMode.PeekLock);
        OnMessageOptions options = new OnMessageOptions();
        options.AutoComplete = false;
        sc.OnMessage((message) => {
            try {
                sbm = new ServiceBusMessage() {
                    topicName = sub.topicName, 
                    messageText = message.GetBody<String>()
                };
                list.Add(sbm);
                message.Abandon();
            }
            catch (Exception) {
                message.Abandon();
                throw;
            }
        }, options);
         return list;
    }

我错过了什么吗?或者onMessage()方法是否存在自动死信的问题?

谢谢!

Azure服务总线订阅客户端.OnMessage总是在不应该完成的时候完成消息

当消息被放弃时,服务总线将立即使其可用,以便重新交付给主题的任何订阅者。

如果您正在尝试配置多播机制,其中多个侦听器都接收相同的消息,那么要理解给定订阅上的所有侦听器都将竞争相同的消息。为了让每个侦听器接收自己的消息副本,只需为每个侦听器创建对主题的唯一订阅。

如果你的意图是延迟被放弃的消息的重新交付,你可以看看SO问题:放弃Azure SB消息的正确方法是什么,以便它在将来以一种我可以控制的方式再次可见?