【发布时间】:2015-07-10 15:40:28
【问题描述】:
使用 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);
}
我们遇到的问题是在一段时间没有消息排队之后,排队的新消息无法被 OnMessage 事件泵拾取,直到应用程序重新启动。
我知道使用 Worker Roles 可以做到这一点,但出于监控和管理目的,我们决定在 Web 应用的 Application Start 中实现这一点。
【问题讨论】:
-
你检查死信队列了吗?如果那里有消息,您应该能够看到消息处理失败的原因。
-
在 DL 中他们只是超时。以编程方式,该过程刚刚停止。
标签: c# azure azure-servicebus-queues