Vertx web и graphql - PullRequest
       29

Vertx web и graphql

0 голосов
/ 02 марта 2020

Есть пара вопросов, которые я хочу уточнить.

  1. Мы развертываем несколько экземпляров (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'

1 Ответ

1 голос
/ 02 марта 2020
  1. Можно создать несколько экземпляров GraphQLHandler
  2. . Для обработки элементов по событию l oop используйте оператор observeOn, а не subscribeOn* 1007. *
...