如何使用Graphql SPQR库实现GraphQL的订阅功能?
答案 0 :(得分:0)
一般来说,您只需要用@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实现了此协议,因此可以与Apollo客户端一起使用。其他符合规定的客户,例如GraphQL Playground自然也可以使用。
即使您根本不想使用SPQR Spring Boot Starter或Spring,您仍然可以从那里的示例中学习如何实现服务器。至于客户端,任何Apollo教程都可以助您一臂之力。您可以在测试和开发过程中使用GraphQL Playground(GraphiQL目前不支持订阅)。