Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/graphql-java/graphql-java-subscription-example
An example of graphql-java and subscriptions
https://github.com/graphql-java/graphql-java-subscription-example
Last synced: about 1 month ago
JSON representation
An example of graphql-java and subscriptions
- Host: GitHub
- URL: https://github.com/graphql-java/graphql-java-subscription-example
- Owner: graphql-java
- License: mit
- Created: 2017-10-12T20:28:12.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2021-04-07T16:34:11.000Z (over 3 years ago)
- Last Synced: 2024-10-29T22:37:47.127Z (about 1 month ago)
- Language: Java
- Size: 72.3 KB
- Stars: 65
- Watchers: 4
- Forks: 31
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-ccamel - graphql-java/graphql-java-subscription-example - An example of graphql-java and subscriptions (Java)
README
# graphql-java Subscriptions over WebSockets example
An example of using graphql subscriptions via websockets, graphql-java, reactive-streams and RxJava.
To build the example code in this repository type:
./gradlew build
To run the example code type:
./gradlew run
To access the example application, point your browser at:http://localhost:3000/
# Code ExplanationThis example shows how you can use graphql-java subscription support to "subscribe" to a publisher of events.
Then as events occur, graphql-java will map the original graphql query over those same event objects and send out
a stream of `ExecutionResult` objects.In this example application we have a stock update type system defined as:
type Subscription {
stockQuotes(stockCodes:[String]) : StockPriceUpdate!
}
type StockPriceUpdate {
dateTime : String
stockCode : String
stockPrice : Float
stockPriceChange : Float
}The JavaScript client sends a subscription graphql query over websockets to the server:
var query = 'subscription StockCodeSubscription { \n' +
' stockQuotes {' +
' dateTime\n' +
' stockCode\n' +
' stockPrice\n' +
' stockPriceChange\n' +
' }' +
'}';
var graphqlMsg = {
query: query,
variables: {}
};
exampleSocket.send(JSON.stringify(graphqlMsg));
The server executes this with the graphql-java engine:GraphQL graphQL = GraphQL
.newGraphQL(graphqlPublisher.getGraphQLSchema())
.build();ExecutionResult executionResult = graphQL.execute(executionInput);
The result of that initial subscription query is a http://www.reactive-streams.org/ `Publisher`
Publisher stockPriceStream = executionResult.getData();
Under the covers a RxJava 2.x implementation is used to provide a stream of synthesized stock events.Rxjava Flows are an implementation of the reactive streams Publisher interface. You can use ANY reactive streams
implementation as a source. graphql-java uses the reactive streams interfaces as a common interface.See https://github.com/ReactiveX/RxJava for more information on RxJava.
The server side code then subscribes to this publisher of events and sends the results back over the websocket
to the waiting browser client:stockPriceStream.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
subscriptionRef.set(s);
request(1);
}@Override
public void onNext(ExecutionResult er) {
log.debug("Sending stick price update");
try {
Object stockPriceUpdate = er.getData();
getRemote().sendString(JsonKit.toJsonString(stockPriceUpdate));
} catch (IOException e) {
e.printStackTrace();
}
request(1);
}@Override
public void onError(Throwable t) {
log.error("Subscription threw an exception", t);
getSession().close();
}@Override
public void onComplete() {
log.info("Subscription complete");
getSession().close();
}
});The selection set of fields named in the original query will be applied to each underlying stock update object.
The selection set in this example application is selected as follows:
stockQuotes {
dateTime
stockCode
stockPrice
stockPriceChange
}The underling stock update object is mapped to this selection of fields, just like any normal graphql query. The format
of the results on the browser is JSON, again like any other normal graphql query.