C# Azure Webjobs ServiceBusTrigger-在达到MaxDeliveryCount时执行不同的功能

C# Azure Webjobs ServiceBusTrigger-在达到MaxDeliveryCount时执行不同的功能,c#,azure,azureservicebus,azure-webjobssdk,C#,Azure,Azureservicebus,Azure Webjobssdk,我有几个带有ServiceBus触发器的WebJob,并且我有一个自定义任务,可以在消息处理完成后进行一些处理 如果消息处于最后一次重试状态,即即将发送到死信队列,我希望能够执行一些不同的操作(特别是记录错误而不是警告)。发送到CompleteProcessingMessageAsync函数的BrokeredMessage具有DeliveryCount,但我无法找到返回原始队列以查找MaxDeliveryCount的方法。有什么想法吗?不同的队列具有不同的MaxDeliveryCounts,因此

我有几个带有ServiceBus触发器的WebJob,并且我有一个自定义任务,可以在消息处理完成后进行一些处理

如果消息处于最后一次重试状态,即即将发送到死信队列,我希望能够执行一些不同的操作(特别是记录错误而不是警告)。发送到CompleteProcessingMessageAsync函数的BrokeredMessage具有DeliveryCount,但我无法找到返回原始队列以查找MaxDeliveryCount的方法。有什么想法吗?不同的队列具有不同的MaxDeliveryCounts,因此设置常量实际上不是一个选项。我唯一能想到的另一件事是为每个队列的死信队列创建一个单独的作业,但我希望能够在WebJob级别而不是为每个单独的作业创建一个单独的作业

public class CustomMessageProcessor : MessageProcessor
{
    public CustomMessageProcessor(OnMessageOptions messageOptions) : base(messageOptions)
    {
    }

    public override async Task CompleteProcessingMessageAsync(BrokeredMessage message, FunctionResult result, CancellationToken cancellationToken)
    {
        if (result.Succeeded)
        {
            if (!MessageOptions.AutoComplete)
            {
                cancellationToken.ThrowIfCancellationRequested();
                await message.CompleteAsync();
            }
        }
        else
        {
            cancellationToken.ThrowIfCancellationRequested();

            //some other processing

            //If message.DeliveryCount < maxDeliveryCount 
            //  log warning
            //else
            //  log error

            await message.AbandonAsync();
        }
    }
}
公共类CustomMessageProcessor:MessageProcessor
{
公共CustomMessageProcessor(OnMessageOptions messageOptions):基本(messageOptions)
{
}
公共重写异步任务CompleteProcessingMessageAsync(BrokeredMessage消息、FunctionResult结果、CancellationToken CancellationToken)
{
if(result.successed)
{
如果(!MessageOptions.AutoComplete)
{
cancellationToken.ThrowIfCancellationRequested();
等待消息。CompleteAsync();
}
}
其他的
{
cancellationToken.ThrowIfCancellationRequested();
//其他一些处理
//如果message.DeliveryCount
您应该能够从父队列获取Microsoft.ServiceBus.Messaging.QueueDescription,然后使用
MaxDeliveryCount
关闭它。唯一的问题是获取队列描述是一个相对昂贵的操作,因此我建议在开始时只执行一次,并缓存每个队列的值

不同的队列具有不同的MaxDeliveryCounts,因此设置常量实际上不是一个选项

正如Slava Asipenko提到的,我们可以为servicebus队列设置

如何确定消息来自哪个队列

如果在发送过程中设置队列名称,则可以让消息属性知道队列名称。以标签为例:

var message = new BrokeredMessage(object);
message.Label = "queue name";
client.Send(message);

但我如何确定消息来自哪个队列?@anthony keenan这取决于-如何连接自定义消息处理器?您知道哪个处理器实例绑定到哪个队列吗?我对SDK的这一部分没有直接的经验,但我的理解是,当自定义消息处理器连接(例如通过消息传递提供程序)时,您应该看到类似“实体路径”的内容-如果是,您应该将其传递到处理器实例,然后使用引用缓存/共享集合中的队列。自定义消息处理器将覆盖作为Webjobs框架一部分的队列。它在webjob处理的每条消息之前和之后都会被调用,不幸的是,它是全局的,不是特定于队列的,从我所看到的情况来看,队列路径不在代理消息上,因此我无法从那里查找队列。我正在处理的消息实际上是通过主题发布的。因此,您可以在发送端将主题名称设置为消息标签,但是MaxDeliveryCount是特定于队列的,您不知道它是从哪个队列处理的。这看起来也很混乱,更改发送端以弥补接收端的不足。我们还可以设置为subcription。我们还可以为消息添加属性,例如,
message.properties[“subcriptionName”]=“订阅名称”