Как реализовать Подписки, используя Graphql SPQR? - PullRequest
0 голосов
/ 30 июня 2018

Как реализовать функцию подписки GraphQL с использованием библиотеки Graphql SPQR?

1 Ответ

0 голосов
/ 05 июля 2018

В общих чертах, вам просто нужно аннотировать метод с помощью @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.

SPQR Spring Boot Starter , начиная с версии 0.0.3, реализует этот протокол, так что его можно использовать с клиентом Apollo из коробки. Другие совместимые клиенты, например GraphQL Playground , естественно, также может быть использован.

Даже если вы вообще не хотите использовать SPQR Spring Boot Starter или Spring, вы все равно можете узнать, как реализовать сервер из приведенных там примеров. Что касается клиентской части, любой учебник Apollo поможет вам. Вы можете использовать GraphQL Playground во время тестирования и разработки (в настоящее время GraphiQL не поддерживает подписки).

...