如何使用 Graphql SPQR 实现订阅?

Posted

技术标签:

【中文标题】如何使用 Graphql SPQR 实现订阅?【英文标题】:How to implement Subscriptions using Graphql SPQR? 【发布时间】:2018-12-09 08:29:26 【问题描述】:

如何使用 Graphql SPQR 库实现 GraphQL 的订阅功能?

【问题讨论】:

【参考方案1】:

一般而言,您只需使用@GraphQLSubscription 注释方法并确保该方法返回org.reactivestreams.Publisher。 例如

@GraphQLSubscription
public Publisher<Issue> issueStatusChanged(String code) 
    return ...;

但实际上这对你没有多大帮助,除非你已经知道如何获得Publisher

从 Java 9 开始,您可以使用 Flow API,并且使用 org.reactivestreams.FlowAdapters#toPublisher,您可以将 Flow.Publisher 转换为 org.reactivestreams.Publisher。尽管如此,JDK 只有一个内置发布者SubmissionPublisher,它可能不是您需要的。

相反,使用兼容库(如 RxJava 或 Spring Reactor)是迄今为止最容易的。他们使用的类型要么是org.reactivestreams.Publisher 的直接实例,要么是非常容易转换的。

对于使用 RxJava 的示例,您可以看到来自 graphql-java 的this demo project。或来自 SPQR 的 this test。但是,这两种方法都过于简单,无法实际使用。

有关更实际的示例,请参阅 SPQR Spring Boot Starter 项目中的this demo。它使用 Spring Reactor,无论您是否使用 Spring,您都可以使用它。每次相关突变运行时,该示例都会发布更新。

现在,制作Publisher 只是问题的一半。您需要有一种方法将更新发送到客户端。此外,客户端和服务器需要就他们将用于交换消息(新结果、任何遇到的错误以及控制消息)的协议达成一致。目前,只有一种广泛使用的协议存在 - Apollo graphql-ws protocol。它基于 WebSockets。

SPQR Spring Boot Starter,从 0.0.3 版本开始,实现了这个协议,因此可以开箱即用地与 Apollo 客户端一起使用。其他合规客户,例如GraphQL Playground自然也可以用。

即使您根本不想使用 SPQR Spring Boot Starter 或 Spring,您仍然可以从那里的示例中学习如何实现服务器。至于客户端,任何 Apollo 教程都会让你继续前进。您可以在测试和开发期间使用 GraphQL Playground(GraphiQL 目前不支持订阅)。

【讨论】:

感谢您的回复。我接下来的步骤现在很清楚了。我实际上正在使用 Spring Boot。这是我的首选框架。

以上是关于如何使用 Graphql SPQR 实现订阅?的主要内容,如果未能解决你的问题,请参考以下文章

如何查询 GraphQL SPQR

GraphQL SPQR - 如何获取客户端使用查询请求的字段列表

如何使用 SPQR 获取生成的方案文件 .graphqls?

使用 graphql-spqr、java 和 mongo 进行中继分页

graphql-spqr 无法查询父类字段

我们如何从 GraphQL 的 RequestContextHolder 获取 GraphQL 的 HttpServletRequest(DefaultGlobalContext)(使用 graphq