You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:41:03