Quarkus GraphQL Subscription客户端断开时如何触发自定义动作?
可行,下面是具体实现方案
你的需求完全可以实现,核心是利用GraphQL Subscription底层基于Reactive流的特性——客户端断开连接(无论主动离开还是连接失败)时,对应的Reactive流会触发终止事件,我们可以通过流的终止回调来执行特定动作。
针对你提供的代码(看起来是基于Mutiny的Reactive框架,比如Quarkus GraphQL),可以通过以下方式修改:
@Subscription("Notification") fun notification(id: UUID): Multi<NotificationDto>? { return dataSource.pubsub(NotificationDto::class.java) .subscribe(id.toString()) .broadcast() .onEachSubscription { subscription -> // 为每个订阅客户端添加终止回调 subscription.invokeOnTermination { // 这里执行客户端断开时的特定动作 // 示例:取消Redis订阅、更新用户在线状态、清理资源等 handleClientDisconnect(id) } } .toAllSubscribers() } // 自定义的断开处理逻辑 fun handleClientDisconnect(id: UUID) { // 替换为你的业务代码,比如: // dataSource.pubsub().unsubscribe(id.toString()) // 更新Redis中用户的在线状态为离线 }
关键说明:
invokeOnTermination会在流无论正常完成还是异常终止时触发,完美覆盖你提到的「连接失败」「用户离开页面」两种场景。- 因为你用了
broadcast().toAllSubscribers()实现多订阅者共享流,通过onEachSubscription可以为每个单独的客户端订阅添加独立的终止回调,确保每个用户断开时都能触发动作。 - 如果你的框架不是Mutiny,其他Reactive库(如RxJava、Spring WebFlux)也有类似的API,比如RxJava的
doOnDispose、WebFlux的doFinally,核心逻辑一致。
内容的提问来源于stack exchange,提问作者Aldic
相关产品推荐
相关产品推荐

