Instrumentation拦截器

通过实现Instrumentation接口,可以观察一个query的执行,或修改运行期的行为。

最常见的用途是进行性能监控,和自定义日志记录,但它也可以用于完成其他任务。

创建GraphQL对象时,可以绑定相关的Instrumentation实现。

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

自定义Instrumentation拦截器

Instrumentation实现类需要实现"begin"开头的方法。这个方法会在查询执行的过程中,在每个步骤开始之前被调用。

每个回调方法都必须返回一个非空的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 {@Overridepublic 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();}@Overridepublic InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters) {long startNanos = System.nanoTime();return new SimpleInstrumentationContext<ExecutionResult>() {@Overridepublic void onCompleted(ExecutionResult result, Throwable t) {CustomInstrumentationState state = parameters.getInstrumentationState();state.recordTiming(parameters.getQuery(), System.nanoTime() - startNanos);}};}@Overridepublic 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;}@Overridepublic 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);}}

链式Instrumentation拦截器

可以使用ChainedInstrumentation类,将多个Instrumentation对象进行聚合。ChainedInstrumentation类接收一个Instrumentation对象列表参数,然后按照它们定义的顺序依次调用。

        List<Instrumentation> chainedList = new ArrayList<>();chainedList.add(new FooInstrumentation());chainedList.add(new BarInstrumentation());ChainedInstrumentation chainedInstrumentation = new ChainedInstrumentation(chainedList);GraphQL.newGraphQL(schema).instrumentation(chainedInstrumentation).build();

字段验证Instrumentation

FieldValidationInstrumentation拦截器,可以在执行查询前,校验字段和字段参数。如果校验失败,那么执行过程将终止,error信息添加到查询的result当中。

可以自定义FieldValidation的实现,或直接使用SimpleFieldValidation类来为每个字段增加校验规则。

        ExecutionPath fieldPath = ExecutionPath.parse("/user");FieldValidation fieldValidation = new SimpleFieldValidation().addRule(fieldPath, new BiFunction<FieldAndArguments, FieldValidationEnvironment, Optional<GraphQLError>>() {@Overridepublic 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();

GraphQL Java - Instrumentation相关推荐

  1. 用Java Instrumentation 在类加载时添加记录

    用Java Instrumentation 在类加载时添加记录 发布者:xanadu0214   来源:网络转载   发布日期:2013年11月06日   Java学习交流群:471651004 在分 ...

  2. JAVA Instrumentation

    什么是Instrumentation? java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序.这种监测和协助包括但不限于获 ...

  3. graphql java demo_GraphQL学习,Java简单实现

    简介 是一种查询语言,类似前端与后端之间通过sql语言进行交互.用类似json的语言来查询需要的数据. 如在以下查询语句 { bookById(id: "1") { id name ...

  4. 作为一名Java程序员,你竟然不知道Instrumentation

    转载自  作为一名Java程序员,你竟然不知道Instrumentation 作者:Yilun Fan  来源:http://1t.click/fMA 对于Java 程序员来说,Java Instru ...

  5. java world_Java World中的GraphQL简介

    java world 许多人认为GraphQL仅适用于前端和JavaScript,它在Java等后端技术中不占优势,但事实确实如此. 还经常将GraphQL与REST进行比较,但是这种比较是否合理? ...

  6. Java World中的GraphQL简介

    许多人认为GraphQL仅适用于前端和JavaScript,它在Java等后端技术中没有定位,但事实确实如此. 还经常将GraphQL与REST进行比较,但是这种比较是否合理? 首先,让我开始回答其中 ...

  7. GraphQL(四):GraphQL工程化实践

    Demo到产品化还有很长的路要走,尤其是要在尽量小的影响当前框架的前提下引入新的方法. GraphiQL GraphiQL是整个GraphQL优势的重要一环,然而默认的GraphiQL不允许配置gra ...

  8. Spring发布新成员:Spring GraphQL!高调出场的GraphQL能火起来了吗?

    7月6日,在GraphQL Java诞生6周年的时候,Spring社区通过博客宣布正式创建全新项目:Spring GraphQL,同时还发布了这个新项目的里程碑1.0版本. 博客原文:https:// ...

  9. Spring Boot + GraphQL 才是 API 的未来!

    前言 在浅尝GraphQL一文描述了GraphQL及基本使用,本文提供一个基本示例,描述如何基于spring boot的web项目快速应用. graphql-java的官方文档:Getting sta ...

最新文章

  1. 科大星云诗社动态20210315
  2. 编程之美 set 1 不要被阶乘吓倒
  3. jzoj4049-排序【搜索】
  4. python找出在原图中的位置_Python 通过截图匹配原图中的位置(opencv)实例
  5. 原来 Sql Server 的存储过程是可以调试的
  6. ideal如何快速导入import_【MAC版】pr预设安装目录?pr如何快速批量导入lut
  7. sql2012 ssrs_您必须在SQL Server Reporting Services(SSRS)中记录的十件事
  8. 将Sublime Text添加到右键菜单中
  9. 查询各种物流运输信息
  10. win10安装mysql报错——无法项识别为 cmdlet、函数、脚 本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  11. 满月啦,Linux公众号!
  12. 超宽带 DWM1000模块 电气规格
  13. flutter之dart语言发展
  14. 是否开启谷歌Ad广告中的搜索网络合作伙伴?
  15. 基于iis配置一个ftp服务器
  16. 来了!全球三个首次5G技术实现; 辽宁省完成5G投资36.4亿元; 中兴发布白皮书; 7月国内5G手机出货1391.1万...
  17. java bsdiff_Android差分包生成和合成新包-bsdiff
  18. Jweb-Servlet 知识点+代码实操
  19. 简易数字示波器,DDS信号源的设计方案
  20. Matlab计算状态转移频数,matlab统计频数

热门文章

  1. goahead处理json_GoAhead Web Server远程代码执行漏洞分析(附PoC)
  2. html导入mybase,mybase使用教程_早知道早受益
  3. 希望我讲明白了G1 GC的过程
  4. AI, 区块链,云计算哪个方向更好呢
  5. mybatis中xml开发like的几种写法
  6. ChatGPT似乎有的时候并不能搞懂Java的动态分派,你懂了吗?
  7. hadoop入门1:ERROR Cannot set priority of datanode process
  8. vs中遇见> 0x7BA4EF8C (ucrtbased.dll)处(位于 Project1.exe 中)引发的异常: 0xC0000005: 写入位置 0x00540000 时发生访问冲突。
  9. 有乙肝可以买什么保险最合适?最新投保推荐请拿好!
  10. 我靠着这套学习视频+文档,自学Android从外卖小哥走到了头条