C# Azure ServiceBus OnMessage是否阻止呼叫?
我们正在利用Azure ServiceBus队列处理大量客户端请求。然而,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
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);
}
}
}