如何追踪HotChocolate内存订阅的订阅者?是否有连接事件可挂钩?
HotChocolate内存订阅:订阅者追踪与连接事件机制
一、追踪特定订阅的订阅者
默认内存订阅提供器没有直接暴露订阅者查询接口,但可以通过自定义扩展实现追踪:
- 实现
ISubscriptionInterceptor接口,重写OnSubscribeAsync方法,在订阅创建时记录连接ID、订阅字段/主题、用户标识等关联信息,存入自定义内存缓存或数据库。 - 重写
OnUnsubscribeAsync方法,在订阅取消时移除对应记录。
示例代码片段:
public class CustomSubscriptionInterceptor : DefaultSubscriptionInterceptor { private readonly ISubscriberTracker _tracker; public CustomSubscriptionInterceptor(ISubscriberTracker tracker) { _tracker = tracker; } public override ValueTask OnSubscribeAsync(ISubscription subscription, CancellationToken ct) { var connectionId = subscription.Context.ConnectionId; var userId = subscription.Context.GetUser().Id; var subscriptionField = subscription.Field.Name; _tracker.TrackSubscriber(connectionId, userId, subscriptionField); return base.OnSubscribeAsync(subscription, ct); } public override ValueTask OnUnsubscribeAsync(ISubscription subscription, CancellationToken ct) { var connectionId = subscription.Context.ConnectionId; _tracker.UntrackSubscriber(connectionId); return base.OnUnsubscribeAsync(subscription, ct); } }
二、可挂钩的连接与订阅事件
HotChocolate提供多类生命周期钩子,用于捕获关键事件:
连接生命周期钩子:实现
IConnectionInterceptor接口,捕获连接建立、断开事件:OnConnectAsync:客户端建立WebSocket连接时触发,可记录连接基础信息。OnDisconnectAsync:客户端断开连接时触发,可清理该连接的所有订阅记录。
示例代码:
public class CustomConnectionInterceptor : DefaultConnectionInterceptor { private readonly ISubscriberTracker _tracker; public CustomConnectionInterceptor(ISubscriberTracker tracker) { _tracker = tracker; } public override ValueTask OnConnectAsync(IConnection connection, CancellationToken ct) { _tracker.RecordConnection(connection.Id, connection.Context.GetUser().Id); return base.OnConnectAsync(connection, ct); } public override ValueTask OnDisconnectAsync(IConnection connection, CancellationToken ct) { _tracker.CleanupConnectionSubscriptions(connection.Id); return base.OnDisconnectAsync(connection, ct); } }订阅生命周期钩子:通过
ISubscriptionInterceptor直接拦截订阅的创建、取消动作,是追踪订阅者最直接的方式。
三、注册自定义拦截器
在DI容器中注册自定义拦截器,覆盖默认实现:
services.AddGraphQLServer() .AddSubscriptionType<SubscriptionType>() .AddInMemorySubscriptions() .AddConnectionInterceptor<CustomConnectionInterceptor>() .AddSubscriptionInterceptor<CustomSubscriptionInterceptor>();
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

