GraphQL Java - Инструментарий

Инструментарий перехватчик

Реализуя интерфейс инструментария, вы можете наблюдать за выполнением запроса или изменить поведение выполнения.

Наиболее часто используется для мониторинга производительности и пользовательских лесозаготовок, но он также может быть использован для выполнения других задач.

При создании объекта GraphQL, вы можете связать соответствующий инструментарий, достигнутый.

        GraphQL.newGraphQL(schema)
                .instrumentation(new TracingInstrumentation())
                .build();

Пользовательские Инструменты перехватчик

Класс реализации инструментария необходимо реализовать метод в начале «начать». Этот метод во время выполнения запроса, был вызван перед началом каждого шага.

Каждый метод обратного вызова должна возвращать непустое InstrumentationContext объекта, объект будет отозван, когда выполнение завершается на этом этапе, и сказать, был ли вызов успешным или ошибка (вы можете получить Throwable объект).

В следующем примере, дал Instrumentation пользовательского перехватчика. Он может быть использован для измерения общего времени выполнения выполнения, и результат сохраняется в состоянии, в котором объект.

    class CustomInstrumentationState implements InstrumentationState {
        private Map<String, Object> anyStateYouLike = new HashMap<>();

        void recordTiming(String key, long time) {
            anyStateYouLike.put(key, time);
        }
    }

    class CustomInstrumentation extends SimpleInstrumentation {
        @Override
        public InstrumentationState createState() {
            //
            // instrumentation state is passed during each invocation of an Instrumentation method
            // and allows you to put stateful data away and reference it during the query execution
            //
            return new CustomInstrumentationState();
        }

        @Override
        public InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters) {
            long startNanos = System.nanoTime();
            return new SimpleInstrumentationContext<ExecutionResult>() {
                @Override
                public void onCompleted(ExecutionResult result, Throwable t) {
                    CustomInstrumentationState state = parameters.getInstrumentationState();
                    state.recordTiming(parameters.getQuery(), System.nanoTime() - startNanos);
                }
            };
        }

        @Override
        public DataFetcher<?> instrumentDataFetcher(DataFetcher<?> dataFetcher, InstrumentationFieldFetchParameters parameters) {
            //
            // this allows you to intercept the data fetcher used to fetch a field and provide another one, perhaps
            // that enforces certain behaviours or has certain side effects on the data
            //
            return dataFetcher;
        }

        @Override
        public CompletableFuture<ExecutionResult> instrumentExecutionResult(ExecutionResult executionResult, InstrumentationExecutionParameters parameters) {
            //
            // this allows you to instrument the execution result some how.  For example the Tracing support uses this to put
            // the `extensions` map of data in place
            //
            return CompletableFuture.completedFuture(executionResult);
        }
    }

Инструментарий перехватчик цепи

Класс ChainedInstrumentation может быть использован, множество объектов полимеризации приборостроения. Измерительные приборы класса ChainedInstrumentation получения списка параметров объектов, а также последовательно в порядке, они определены в вызове.

        List<Instrumentation> chainedList = new ArrayList<>();
        chainedList.add(new FooInstrumentation());
        chainedList.add(new BarInstrumentation());
        ChainedInstrumentation chainedInstrumentation = new ChainedInstrumentation(chainedList);

        GraphQL.newGraphQL(schema)
                .instrumentation(chainedInstrumentation)
                .build();

Инструменты проверки поля

FieldValidationInstrumentation перехватчики, прежде чем выполнить запрос, проверить поля и параметры полей. Если проверка не удалась, то выполнение прекращается, информация об ошибке добавляется к результату запроса им.

Это может быть пользовательским FieldValidation реализации или непосредственно класс SimpleFieldValidation увеличить правила проверки для каждого поля.

        ExecutionPath fieldPath = ExecutionPath.parse("/user");
        FieldValidation fieldValidation = new SimpleFieldValidation()
                .addRule(fieldPath, new BiFunction<FieldAndArguments, FieldValidationEnvironment, Optional<GraphQLError>>() {
                    @Override
                    public Optional<GraphQLError> apply(FieldAndArguments fieldAndArguments, FieldValidationEnvironment environment) {
                        String nameArg = fieldAndArguments.getFieldArgument("name");
                        if (nameArg.length() > 255) {
                            return Optional.of(environment.mkError("Invalid user name", fieldAndArguments));
                        }
                        return Optional.empty();
                    }
                });

        FieldValidationInstrumentation instrumentation = new FieldValidationInstrumentation(
                fieldValidation
        );

        GraphQL.newGraphQL(schema)
                .instrumentation(instrumentation)
                .build();

рекомендация

отwww.cnblogs.com/pku-liuqiang/p/11529115.html
рекомендация