如何使用Graphql SPQR实施订阅?

时间:2018-06-30 09:38:53

标签: graphql graphql-java graphql-subscriptions graphql-spqr

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

1 个答案:

答案 0 :(得分:0)

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

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

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

从Java 9开始,您可以使用Flow API,并且可以使用org.reactivestreams.FlowAdapters#toPublisherFlow.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。

版本0.0.3中的

SPQR Spring Boot Starter实现了此协议,因此可以与Apollo客户端一起使用。其他符合规定的客户,例如GraphQL Playground自然也可以使用。

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