当前位置: 首页 > 知识库问答 >
问题:

服务总线消息会话接受,但接收返回空

冀望
2023-03-14

我们使用Azure服务总线队列,并使用AcceptMessage会话(代码如下)接收消息。

接受消息会话成功,但当我在消息会话上调用接收时,返回null。

这种情况不会一直发生,而是在创建队列一段时间后发生。发生这种情况时,我验证了队列不是空的。当我关闭消息会话我看到我的队列缩短(在正确的消息数量!)但是我没有收到我的信息...

我使用的代码是:

public IEnumerable<T> ReceiveBatch<T>(TimeSpan waitTime)
    {
        MessageSession sessionReceiver = null;
        IEnumerable<T> retval;

        QueueClient queueClient = GetQueueClient<T>();

        try
        {
            sessionReceiver = queueClient.AcceptMessageSession(waitTime);
            retval = ReceiveSessionMessages<T>(sessionReceiver);
        }
        finally
        {
            if (sessionReceiver != null) sessionReceiver.Close();
        }

        return retval;
    }

    private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver)
    {
        receiver.PrefetchCount = 10;

        BrokeredMessage message;
        var retval = new List<T>();
        while ((message = receiver.Receive()) != null)
        {
             var item = message.GetBody<T>();
             if (!Equals(item, default(T))) retval.Add(item);
        }

        return retval;
    }

更新:

我怀疑,虽然某些会话的所有消息都已过期,但会话本身仍然存在,因此它被接受,但没有收到任何消息。

共有1个答案

左丘凡
2023-03-14

这里需要考虑的两个项目是使用<代码>预取计数>代码>进行隐式批处理,而不是使用“代码”> CyrEffeBuffs< /Cord> API来显式地获取一组消息。请参阅下面的代码示例。

private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver)
        {
            var retval = new List<T>();
            var messages = receiver.ReceiveBatch(10);
            foreach(BrokeredMessage message in messages)
            {
                var item = message.GetBody<T>();
                if (!Equals(item, default(T))) retval.Add(item);
            }

            return retval;
        }

同样,如果您收到消息会话,但没有消息可以详细说明它们是否已过期?您是否设置了TimeToLive值,或者在到达MaxDeliveryCount后消息会变成死信。

 类似资料:
  • 我正在用java编写代码(使用Azure SDK for java),我有一个包含会话消息的服务总线队列。我想接收这些消息并将它们处理到另一个地方。 我使用QueueClient连接到队列,然后使用registerSessionHandler处理消息(下面的代码)。 问题是,每当收到消息时,我都可以打印有关它的所有详细信息,包括内容,但它会打印10次,每次之后都会打印一个异常。(打印10次:我理解

  • 我需要一起处理相同的消息集,为此,我尝试了Azure服务总线会话启用功能。为了测试这一点,我创建了一个非常简单的应用程序,一个消息在队列中成功提交,然而,当试图在“ReceiveSessionMessage”函数中接收消息时,消息会话不会返回,程序会在这一行之后退出。 我无法找出确切的根本原因,任何帮助都将不胜感激。谢谢 等待会话客户端。AcceptMessageSessionAsync();]

  • 参考https://github.com/Azure/azure-service-bus/tree/master/samples/dotnet/gettingstart/microsoft.Azure.servicebus/basicsendreceiveusingtopicsubscriptionclient,我了解Azure服务总线主题的一般工作方式,我的问题更多地是关于它实际上是如何工作的。

  • 在我的聊天应用程序中,每当用户收到新消息时,我使用FCM和Firebase功能发送通知。 为此,我有一个FirebaseMessagingService,它覆盖了。除此之外,此服务还覆盖。每当用户第一次启动应用程序时,就会调用,我检索一个新令牌并将其存储在Firebase实时数据库中。 然后我去和一些用户聊天(不关闭应用程序)。当我收到新消息时,我会收到通知。调用。 问题是,当我关闭应用程序,然后

  • 我正在使用带有.NET核心的Azure服务总线 在我们的应用程序中,我们正在向服务总线发送会话消息。每当我们收到带有session-Id的取消请求时,我们需要删除/删除/完成带有该特定sessionId的消息,而不需要进行任何进一步的处理 但我得到了错误-请求的会话'session-name'不能被接受。它可能被另一个接收器锁定。

  • 我希望以批处理模式接收来自Azure ServiceBus主题的消息。 阅读https://docs.microsoft.com/en-us/Azure/Azure-functions/functions-best-practices时指出: 我有一个方法: 这个方法是有效的,但它一次只需要一个消息。 根据Microsoft文档,我可以将其更改为: 注意:主题和订阅已启用“启用批处理操作”设置。