Как реализовать Подписки, используя Graphql SPQR?
Как реализовать функцию подписки GraphQL с использованием библиотеки Graphql SPQR?
1 ответ
В общих чертах, вы просто должны аннотировать метод с @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
это только половина проблемы. У вас должен быть способ отправить обновления клиенту. Обычно это делается через WebSocket, хотя также можно использовать SSE (события, отправленные сервером).
Приведенный выше пример graphql-java использует WebSocket напрямую, а SPQR создает сервер SockJS, поэтому может адаптировать поведение в зависимости от доступных возможностей сети и клиента.
SPQR Spring Boot Starter все еще находится на очень ранней стадии разработки, но пытается сделать все это простым и уже пригодным для использования. Убедитесь, что вы ознакомились с примером, базовой реализацией серверной части и тем, как настроенная версия клиента GraphiQL использует ее с помощью библиотеки SockJS.
В конце концов, он будет поддерживать протокол Apollo WebSocket, чтобы его можно было использовать с клиентом Apollo из коробки.
Даже если вы вообще не хотите использовать SPQR Spring Boot Starter или Spring, вы все равно можете узнать, как реализовать сервер и клиент из приведенных там примеров.