servicebus messagecount check返回true,即使它为0

时间:2017-04-20 08:51:07

标签: azure boolean-logic servicebus

我有一个功能,可以检查我的servicebus中是否还有一条消息,它会不断检查。

获取ammount的函数是:

    public int GetActiveMessageCount()
    {
        var connectionString = azureConnectionStringWithoutEntityPath;
        long messageCount = 0;
        try
        {
            var nameSpaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
            messageCount = nameSpaceManager.GetQueue(azureQueueName).MessageCountDetails.ActiveMessageCount;
        }
        catch
        {
            throw;
        }

        return (int)messageCount;
    }

支票是:

    public bool MessageCountBiggerThenZero()
    {
        int messageCount = 0;
        try
        {
            messageCount = this.GetActiveMessageCount();
        }
        catch (Exception e)
        {
            Debug.WriteLine("An error occured while checking if the messageValue is bigger then zero and not null saying : " + e);
        }
        return messageCount > 0;
    }

这种方法在零消息开始时完美无效,但在它开始接收消息然后传递最后一个消息后,它仍然通过MessageCountBiggerThenZero检查。

有谁知道这是怎么回事? serviceBus在最后一条消息之后是否返回其他值?

编辑:

更深入地了解支票(因此,即使没有消息,它仍会传递if语句):

public object RecieveOneMessageFromServiceBus()
    {
        var client = QueueClient.CreateFromConnectionString(azureConnectionString);
        BrokeredMessage brokermessage = null;
        client.PrefetchCount = 1; // get 1 message at a time
        if (MessageCountBiggerThenZero())
        {
            try
            {
                 // try to recieve message
            }
            catch
            {
                throw;
            }
        }
        else
        {
            return null;
        }       
    }

2 个答案:

答案 0 :(得分:0)

根据您的代码,我假设您没有调用BrokeredMessage.Complete,这可能会在处理完邮件后将邮件标记为已处理并已删除。我修改了您的代码并添加日志以打印当前活动消息,如下所示:

public static object RecieveOneMessageFromServiceBus()
{
    var client = QueueClient.CreateFromConnectionString(azureConnectionString);
    client.PrefetchCount = 1; // get 1 message at a time
    if (MessageCountBiggerThenZero())
    {
        try
        {
            Console.WriteLine("begin retrieving a message...");
            var message = client.Receive();
            Console.WriteLine($"received message with MessageId:{message.MessageId}");

            //after receive the message for handling
            Console.WriteLine($"after received a message in processing, active messages count:{GetActiveMessageCount()}");

            //after handled the message
            message.Complete();

            Console.WriteLine($"invoke message.Complete() to complete the received message");

            //after receive the message for handling
            Console.WriteLine($"after Complete() the message, active messages count:{GetActiveMessageCount()}");
        }
        catch
        {
            throw;
        }
    }
    return null;
}

enter image description here

此外,您可以登录Azure门户并检查服务总线队列概述下的 ACTIVE MESSAGE COUNT ,如下所示:

enter image description here

此外,您可以按照关于Receive messages from the queue的官方教程而不自行查看当前有效消息,您也可以参考此issue

答案 1 :(得分:0)

好吧我好像修好了但是我不知道如何以及为什么。我确实按照布鲁斯的说法实现了它,但这不起作用。也许完整的方法发送速度不够快或其他东西都没有,但现在我改变了我的接收方法接收和删除并添加了一个计时器,用于获取大约5秒的消息,如:

 var client = QueueClient.CreateFromConnectionString(azureConnectionString,ReceiveMode.ReceiveAndDelete);

brokermessage = client.Receive(TimeSpan.FromSeconds(5));

使用此代码似乎可以工作,任何人都可以解释为什么会非常需要。

编辑:

请参阅下面的评论,了解有关如何更好地实施此

的更多说明