事件规则客户端
一、简介
1.1 概述
事件调度客户端与平台服务事件管理配对,平台事件管理功能添加事件及事件规则,以事件编码为key,规则列表为值,缓存到Redis中。使用该客户端时,只需要依赖该jar包就可以使用事件调度器。调度器根据传入的事件编码查询事件规则,根据规则进行方法或API的调度。
1.2 组件坐标
<dependency>
<groupId>org.hzero.boot</groupId>
<artifactId>hzero-boot-platform</artifactId>
<version>${hzero.boot.version}</version>
</dependency>
1.3 功能特性
- 使用极其简单,提供一个通用的方法入口进行调度
- 支持方法调度和API调度,支持多个匹配的规则按顺序进行调度
- 支持同步、异步的方式调用方法或API
- 支持动态修改规则,启用/禁用规则,动态修改规则的匹配条件等
- 顶层接口设计,可自行根据特殊需求修改默认实现,如规则匹配器、异步调度器等
二、使用说明
2.1 添加事件规则
首先在平台事件管理服务上配置事件及事件规则,添加事件时会为事件生成唯一编码,使用该编码作为调度某个事件的依据。
① 事件规则使用ongl
表达式,语法如下:
- e1 or e2
- e1 and e2
- e1 == e2,e1 eq e2
- e1 != e2,e1 neq e2
- e1 lt e2:小于
- e1 lte e2:小于等于,其他gt(大于),gte(大于等于)
- e1 in e2
- e1 not in e2
- e1 + e2,e1 * e2,e1/e2,e1 - e2,e1%e2
- !e,not e:非,求反
- e.method(args):调用对象方法
- e.property:对象属性值
- e1[ e2 ]:按索引取值,List,数组和Map
- @class@method(args):调用类的静态方法
- @class@field:调用类的静态字段值
② 如果配置的规则调用方式为方法,则添加调用方法类的bean名称以及方法名称。
- 例:
Bean名称:demoService;方法名称:methodA
③ 如果配置的调用方式为API,则添加对应的API地址和API方法。API地址可以在URI中带参数,使用@PathVariable
接收。API方法支持GET
/POST
/PUT
/DELETE
,GET 方式只能将参数拼接到API地址后面,参数值使用占位符{}
表示。其它三种方法将以application/json
的形式发起请求,如果将参数拼接在地址后面,使用 @RequestParam
接收参数,对象则使用 @RequestBody
接收参数。
- 例:
http://examples/demo/{id}/detail?name={name}&type={type}
2.2 开发调度类
① 首先在服务内添加hzero-boot-platform
组件依赖
② 如果是API调用,则没有特殊要求,只需保证API与规则配置的一样即可
③ 如果是方法调用,首先方法调用类需要实现 EventHandlerBean
接口标识为一个事件处理类
- bean的名称默认为类名首字母小写,如果跟规则配置的不一样,需要重载
getBeanName
方法返回对应的bean名称。
④ 在调用的方法上使用 @EventHandlerMethod
注解标识为事件处理方法
- 方法名称默认为方法名称首字母小写,如果跟规则不一致,需要配置该注解的name属性。
⑤ 使用EventScheduler
事件调度器进行事件调度,该调度器提供了一个通用的入口方法:
Object scheduler(String eventCode, Map<String, Object> condition, EventParam... params)
- eventCode:事件编码
- condition:规则匹配条件
- params:调用的方法或API参数的封装,
EventParam
实际是一个Map
,使用EventParam只是为了限制参数类型。- 如果是方法调用,使用
MethodParam
封装参数 - 如果是API调用,使用
ApiParam
封装参数 - 参数顺序无关;如果没有参数则不传
- 如果是方法调用,使用
三、定制化开发
事件调度客户端顶层依赖于接口而非具体实现,使用者若对某一个接口有特殊需求,可重新实现接口并覆盖默认配置即可。有如下接口可定制化开发:
① EventRuleRepository
:事件规则资源库,默认从Redis缓存中获取事件规则。
② RuleMatcher
:规则匹配器,默认使用Ognl
进行规则匹配。
③ RequestHelper
:Http请求辅助类,默认使用RestTemplate
发起Http请求。
④ AsyncScheduleHelper
:异步调度器,使用线程池实现异步调度方法或API。
⑤ EventRequestInterceptor
:事件API请求拦截器,通过实现该接口为请求的header
添加属性。
⑥ RequestTokenInterceptor
: 为header添加token
四、版本更新日志
版本 0.1.0-SNAPSHOT [2018-06-16]
- 第一个迭代版本,支持基于
Ognl
的规则解析 - 支持方法调度或API调度
- 支持同步或异步的方式调用方法或API
展望
- 可以开发支持动态Java代码编译的方式以支持方法调用
- 开发更加强大的规则解析引擎,可以支持SQL、特定的业务条件来匹配规则
- 支持多个规则调用结果的互动,比如第二个规则以第一个规则的执行结果为条件进行匹配
- 规则引擎、平台化,支持业务分析员自己就可以根据业务动态配置规则