我有一个功能,可以检查我的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;
}
}
答案 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;
}
此外,您可以登录Azure门户并检查服务总线队列概述下的 ACTIVE MESSAGE COUNT ,如下所示:
此外,您可以按照关于Receive messages from the queue的官方教程而不自行查看当前有效消息,您也可以参考此issue。
答案 1 :(得分:0)
好吧我好像修好了但是我不知道如何以及为什么。我确实按照布鲁斯的说法实现了它,但这不起作用。也许完整的方法发送速度不够快或其他东西都没有,但现在我改变了我的接收方法接收和删除并添加了一个计时器,用于获取大约5秒的消息,如:
var client = QueueClient.CreateFromConnectionString(azureConnectionString,ReceiveMode.ReceiveAndDelete);
brokermessage = client.Receive(TimeSpan.FromSeconds(5));
使用此代码似乎可以工作,任何人都可以解释为什么会非常需要。
编辑:
请参阅下面的评论,了解有关如何更好地实施此
的更多说明