在azure服务总线的ProcessErrorAsync处理程序中获取用户名

问题描述 投票:0回答:1

我有以下系统组件:

  • Azure 服务总线
  • IHostedService 作为监听 azure 服务总线的后台“线程”
  • SignalR 主机在
    ProcessMessageAsync
    完成时向客户端发送消息。

SignalR
配置为使用名称取自 UserName 的组。

public class NotificationHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        var userName = Context!.User!.Identity!.Name ?? "Empty";
        var userGroupName = CreateUserGroupName(userName);
        await Groups.AddToGroupAsync(Context.ConnectionId, userGroupName);
        await base.OnConnectedAsync();
    }

    private static string CreateUserGroupName(string userName) => $"user_{userName}";
}

发送消息(从 ihostedservice)是这样发生的:

    var userGroupName = CreateUserGroupName(userName ?? "Empty");
    var group = _notificationHub.Clients.Group(userGroupName);
    await group.SendAsync(
        method: "OnReceived",
        arg1: arg1);

当我从

ProcessMessageAsync
调用上述内容时,一切都很好。我在收入消息正文中有用户名(用于获取组名)。

现在,我想在 Azure 服务总线错误(来自

ProcessErrorAsync
回调)的情况下向客户 UI 发送 signalR 消息,但
ProcessErrorAsync
无权访问收入消息,因此无法访问用户名。如何获取
ProcessErrorAsync
中的用户名?这种情况一般怎么处理?

c# azure signalr azureservicebus signalr-hub
1个回答
0
投票

ProcessErrorAsync()
文档 说明

处理程序负责处理该处理器运行时抛出的未处理的异常。实施是强制性的。

有几种情况会调用此处理程序。最常见的是:

  1. 间歇性消息处理错误。通常通过在 Azure 服务总线重新传送消息时重试消息来自动解决。假设
    MaxDeliveryCount
    没有被错误地设置为 1。
  2. 由于处理处理程序+用户代码中的逻辑错误而无法处理消息。
  3. 无效负载导致内部 AMPQ 转换为 .NET 类型失败。

失败的消息,无论有效与否,最终都会进入死信队列。死信队列可以使用其自己的处理器实例进行处理并发出 SignalR 消息(假设消息可以读取)。

TLDR:

ProcessErrorAsync()
不是用于消息处理,而是用于日志记录和指标。如果需要针对所有重试失败的消息的自定义逻辑,请使用死信队列。

© www.soinside.com 2019 - 2024. All rights reserved.