Vul*_*ary 5 c# azure azure-servicebus-queues
使用Azure ServiceBus和OnMessage调用我正在寻找一种方法来确定OnMessage事件泵是否停止从队列中读取.
我们与OnMessage的连接配置如下:
protected virtual void DoSubscription(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();
Log.Warn("DoSubscription: Message Failed to Process Gracefully: {0}{1}", Environment.NewLine, JsonConvert.SerializeObject(request));
}
}
catch (Exception ex)
{
Log.Error("DoSubscription: Message Failed to Process With Exception:", ex);
message.Abandon();
}
});
var options = new OnMessageOptions
{
MaxConcurrentCalls = _config.GetInt("MaxThreadsPerQueue"),
AutoComplete = false,
AutoRenewTimeout = new TimeSpan(0,0,1)
};
options.ExceptionReceived += OnMessageError;
client.OnMessage(transformCallback, options);
}
Run Code Online (Sandbox Code Playgroud)
我们遇到的问题是在一段时间没有消息排队后,OnMessage事件泵无法获取排队的新消息,直到应用程序重新启动.
我意识到有很多方法可以使用Worker Roles来实现这一点,但是出于监控和管理的目的,我们决定在Web应用程序的应用程序启动中实现它.
因此,在与Microsoft的Azure支持团队通话后,在OnMessage或OnMessageAsync错误时没有事件要捕获.由于这些不是阻塞调用,它启动事件泵并返回执行线程,这会产生一个挑战,以确定OnMessage*是否正在执行它的工作.
微软的建议如下:
然而,我确实探索了一些针对OnMessage的防弹,并发现了一些缓解我恐惧的事情.
总而言之,我现在将继续使用OnMessage/OnMessageAsync,并密切关注它.如果我发现改变了我对OnMessage的看法的问题,我会更新这个.
旁白 - 确保在Azure网站中使用OnMessage进行永久监听,并将"始终打开"配置选项设置为"打开".否则,除非Web请求进入,否则OnMessage将被处理,并且在HTTP请求重新唤醒Web应用程序之前将不再处理消息.
| 归档时间: |
|
| 查看次数: |
2253 次 |
| 最近记录: |