C# Azure ServiceBus OnMessage是否阻止呼叫?

C# Azure ServiceBus OnMessage是否阻止呼叫?,c#,azure-web-app-service,azure-servicebus-queues,C#,Azure Web App Service,Azure Servicebus Queues,我们正在利用Azure ServiceBus队列处理大量客户端请求。然而,OnMessage调用似乎是一个阻塞调用,但是如果它确实是一个阻塞调用,那么这个调用上的阻塞是非常不一致的 我试图完成的是从web服务应用程序中永久性地观察队列(以允许从正在运行的应用程序中挖掘度量) 我正在创建以下订阅: protected virtual void Subscribe(string queueName, Func<QueueRequest, bool> callback) { var

我们正在利用Azure ServiceBus队列处理大量客户端请求。然而,
OnMessage
调用似乎是一个阻塞调用,但是如果它确实是一个阻塞调用,那么这个调用上的阻塞是非常不一致的

我试图完成的是从web服务应用程序中永久性地观察队列(以允许从正在运行的应用程序中挖掘度量)

我正在创建以下订阅:

protected virtual void Subscribe(string queueName, Func<QueueRequest, bool> callback)
{
    var client = GetClient(queueName, PollingTimeout);
    var transformCallback = new Action<BrokeredMessage>((message) =>
    {
        try
        {
            var request = message.ToQueueRequest();
            if (callback(request))
            {
                message.Complete();
            }
            else
            {
                message.Abandon();
            }
        }
        catch (Exception ex)
        {
            //TODO: Log the error
            message.Abandon();
        }
    });
    var options = new OnMessageOptions
    {
        MaxConcurrentCalls = _config.GetInt("MaxThreadsPerQueue"),
        AutoComplete = false
    };
    options.ExceptionReceived += OnMessageError;
    client.OnMessage(transformCallback, options);
}
这修复了由于未被拾取而导致消息过期到死信的问题,但是这会导致其他问题

由于OnMessage是一个可计费的操作,当我看到日志文件告诉我队列的开始和结束间隔不到一秒,并且日志文件的大小增长非常快时,我会感到担心

我将我的
MessagingFactory
设置为
OperationTimeout
为1天,但这似乎不会像我预期的那样影响订阅打开/关闭状态的频率


我已经看到了很多作为工人角色的示例,但是这并不能完成我们正在尝试做的事情。我目前正在从我们的web应用程序的Global.asax.cs连接这个。非常感谢您的建议

您的第一种方法是正确的,MaxThreadsPerQueue的值决定了有多少线程可用于处理您的消息。听起来好像这些线程已经用完了(可能回调处理消息需要一些时间?)


你应该考虑使用它来接收你的消息。< /P> < P>消息和OnMessageAsync没有阻塞调用。这些需要实例化一次,并将继续订阅队列,直到应用程序终止


有关更多详细信息,请参阅相关帖子:

如何判断OnMessage是否不再附加?这仍然不能回答OnMessage本身是否阻塞。我想不是。。。或者pseudo不是,这引出了一个有趣的问题:如何知道它是否失败、断开连接或挂起?
protected void MonitorQueue()
{
    IsRunning = true;
    while (IsRunning)
    {
        try
        {
            Log.Info("MonitoringThread: OnMessage beginning logging for {0}", QueueName);
            QueueClient.Subscribe(QueueName, Processor);
            Log.Info("MonitoringThread:  OnMessage ended logging for {0}", QueueName);
        }
        catch (Exception ex)
        {
            IsRunning = false;
            Log.Error("MonitoringThread: Error in subscription for {0}: ", ex, QueueName);
        }

        if (SleepBeforeReinit > 0 && IsRunning)
        {
            Thread.Sleep(SleepBeforeReinit);
        }
    }
}