Есть пара вопросов, которые я хочу уточнить.
- Мы развертываем несколько экземпляров (20) вертикали, и это создаст несколько экземпляров GraphQLHandler. Это нормально, или мы должны придерживаться только одного экземпляра GraphQLHandler?
// Inside the constructor of the verticle
this.graphQLHandler = GraphQLHandler.create(createGraphQL(), new GraphQLHandlerOptions().setRequestBatchingEnabled(true));
private GraphQL createGraphQL() {
log.info("**** Loading the graphQL schema ****");
String schema = vertx.fileSystem().readFileBlocking("tetris.graphqls").toString();
SchemaParser schemaParser = new SchemaParser();
TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);
RuntimeWiring runtimeWiring = newRuntimeWiring()
.wiringFactory(new WiringFactory() {
@Override
public DataFetcher getDefaultDataFetcher(FieldWiringEnvironment environment) {
return new VertxPropertyDataFetcher(environment.getFieldDefinition().getName());
}
})
.scalar(ScalarDataTypes.instantScalar)
.scalar(ExtendedScalars.Json)
.type("Query", builder -> {
VertxDataFetcher<JsonObject> getArrangementDetailsByLegacyCodeAndEffectiveDate = new VertxDataFetcher<>(this::getArrangementDetailsByLegacyCodeAndEffectiveDate);
return builder
.dataFetcher("getArrangementDetailsByLegacyCodeAndEffectiveDate", getArrangementDetailsByLegacyCodeAndEffectiveDate);
})
.build();
SchemaGenerator schemaGenerator = new SchemaGenerator();
GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
return GraphQL.newGraphQL(graphQLSchema).build();
}
Мы используем rx java, чтобы получить результат и вернуть обещание. Когда мы возвращаем обещание, выполнение происходит в потоке rx java. Мы хотим перенести это на событие l oop. Как этого достичь.
private void getArrangementDetailsByLegacyCodeAndEffectiveDate(DataFetchingEnvironment dataFetchingEnvironment, Promise<JsonObject> promise) {
Scheduler scheduler = RxHelper.scheduler(vertx.getOrCreateContext());
Handler<AsyncResult<JsonObject>> resultHandler = handler -> {
if (handler.succeeded()) {
promise.complete(handler.result());
} else {
log.error(new LogEvent("graphql_subscribe_error", traceId).addThrowable(handler.cause()).toString());
promise.fail(handler.cause());
}
};
getArrangementsFlowable.
...
.subscribeOn(scheduler)
.subscribe(SingleHelper.toObserver(resultHandler));
}
Журналы:
01:04:05.520 [RxCachedThreadScheduler-3] DEBUG graphql.execution.ExecutionStrategy - '70fad529-b19b-426a-8f7c-82a4a3d0b9ea' completing field '/getArrangementDetailsByLegacyCodeAndEffectiveDate'...
01:04:05.520 [RxCachedThreadScheduler-3] DEBUG graphql.execution.ExecutionStrategy - '70fad529-b19b-426a-8f7c-82a4a3d0b9ea' fetching field '/getArrangementDetailsByLegacyCodeAndEffectiveDate/effective_timestamp' using data fetcher 'io.vertx.ext.web.handler.graphql.VertxPropertyDataFetcher'...
01:04:05.520 [RxCachedThreadScheduler-3] DEBUG n.g.execution.ExecutionStrategy - '70fad529-b19b-426a-8f7c-82a4a3d0b9ea' field '/getArrangementDetailsByLegacyCodeAndEffectiveDate/effective_timestamp' fetch returned 'java.lang.String'
01:04:05.520 [RxCachedThreadScheduler-3] DEBUG graphql.execution.ExecutionStrategy - '70fad529-b19b-426a-8f7c-82a4a3d0b9ea' completing field '/getArrangementDetailsByLegacyCodeAndEffectiveDate/effective_timestamp'...
01:04:05.520 [RxCachedThreadScheduler-3] DEBUG graphql.execution.ExecutionStrategy - '70fad529-b19b-426a-8f7c-82a4a3d0b9ea' fetching field '/getArrangementDetailsByLegacyCodeAndEffectiveDate/end_timestamp' using data fetcher 'io.vertx.ext.web.handler.graphql.VertxPropertyDataFetcher'...
01:04:05.520 [RxCachedThreadScheduler-3] DEBUG n.g.execution.ExecutionStrategy - '70fad529-b19b-426a-8f7c-82a4a3d0b9ea' field '/getArrangementDetailsByLegacyCodeAndEffectiveDate/end_timestamp' fetch returned 'java.lang.String'