【发布时间】:2018-09-28 07:58:05
【问题描述】:
我有监听服务总线队列的服务。几天一次,我收到MessageLockLostException。异常本身对我来说很清楚,这不是问题。但是 QueueClient 在收到异常后似乎损坏并停止处理任何进一步的消息。我知道我可以将try / catch 添加到ProcessMessagesAsync。但是我认为ExceptionReceivedHandler 应该处理这种情况,QueueClient 应该尝试再次处理相同的消息(或者如果多次处理失败,则将其发送到 DLQ)。
public class QueueService
{
private readonly QueueClient _queueClient;
public QueueServiceServiceBus(string connectionString, ILogger<QueueServiceServiceBus> logger)
{
_logger = logger;
var serviceBusConnectionStringBuilder = new ServiceBusConnectionStringBuilder(connectionString);
_queueClient = new QueueClient(serviceBusConnectionStringBuilder);
RegisterMessageHandler();
}
private Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
{
_logger.LogError("Message handler encountered an exception {Exception}",
exceptionReceivedEventArgs.Exception);
return Task.CompletedTask;
}
private async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
//Handle message
await _queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
private void RegisterMessageHandler()
{
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
AutoComplete = false
};
_queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
}
}
【问题讨论】:
标签: c# azure azureservicebus