如何使用Graphql SPQR实现订阅?

4
如何使用Graphql SPQR库实现GraphQL订阅功能?
1个回答

5

一般来说,您只需使用@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。
从版本0.0.3开始,SPQR Spring Boot Starter实现了此协议,因此可以立即与Apollo客户端一起使用。其他兼容的客户端,例如GraphQL Playground也可以自然地使用。
即使您不想使用SPQR Spring Boot Starter或Spring,您仍然可以从那里的示例中学习如何实现服务器。至于客户端,任何Apollo教程都可以让您开始。您可以在测试和开发期间使用GraphQL Playground(GraphiQL目前不支持订阅)。

谢谢您的回复。 我的下一步现在很清楚了。 我实际上正在使用Spring Boot。那是我首选的框架。 - S. Das
@kaqqao,你能否提供一些文档或帮助来实现新的Apollo订阅协议graphql-ws?谢谢! - kamboj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接