如何使用Graphql SPQR库实现GraphQL订阅功能?
一般来说,您只需使用@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中的演示项目或SPQR中的测试。但是,这两者都过于简单,无法实际使用。
如果需要更加真实的例子,请查看SPQR Spring Boot Starter项目中的演示。它使用了Spring Reactor,无论你是否使用Spring都可以使用。该示例在每次运行相关变异时发布更新。
现在,创建一个Publisher
只是问题的一半。您需要有一种方法将更新发送给客户端。此外,客户端和服务器需要就交换消息的协议达成一致(新结果、任何遇到的错误以及控制消息)。目前,只存在一种广泛使用的协议-Apollo graphql-ws protocol。它基于WebSockets。