一.使用背景
通常在项目开发过程中,对于一个具体的业务流程,可能需要若干个步骤(节点)协同完成,节点间存在上下文依赖,且根据不同的业务要求,节点的逻辑执行顺序可能会发生调整.那么对于可以复用的节点只是因为业务需求不同而发生了执行顺序的不同,为了灵活的满足业务需求,可以使用规则引擎进行灵活调度.
比如一件事需要经历5个步骤,每个步骤的逻辑依赖各自的上执行结果(共享上下文),而这5个步骤彼此间做的事情又是独立的,经过执行顺序的变化可以满足一系列的业务要求.那么可以使用规则引擎.
二.liteflow规则引擎介绍
liteflow是一个轻量,快速的组件式规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件,并支持热加载规则配置,实现即时修改。
三.LiteFlow的设计原则
LiteFlow是基于工作台模式进行设计的,何谓工作台模式?
n个工人按照一定顺序围着一张工作台,按顺序各自生产零件,生产的零件最终能组装成一个机器,每个工人只需要完成自己手中零件的生产,而无需知道其他工人生产的内容。每一个工人生产所需要的资源都从工作台上拿取,如果工作台上有生产所必须的资源,则就进行生产,若是没有,就等到有这个资源。每个工人所做好的零件,也都放在工作台上。
这个模式有几个好处:
每个工人无需和其他工人进行沟通。工人只需要关心自己的工作内容和工作台上的资源。这样就做到了每个工人之间的解耦和无差异性。
即便是工人之间调换位置,工人的工作内容和关心的资源没有任何变化。这样就保证了每个工人的稳定性。
如果是指派某个工人去其他的工作台,工人的工作内容和需要的资源依旧没有任何变化,这样就做到了工人的可复用性。
因为每个工人不需要和其他工人沟通,所以可以在生产任务进行时进行实时工位更改:替换,插入,撤掉一些工人,这样生产任务也能实时的被更改。这样就保证了整个生产任务的灵活性。
这个模式映射到LiteFlow框架里,工人就是组件,工人坐的顺序就是流程配置,工作台就是上下文,资源就是参数,最终组装的这个机器就是这个业务。正因为有这些特性,所以LiteFlow能做到统一解耦的组件和灵活的装配。--引用
四.liteflow的使用
引入依赖
1.将需要进行编排的各个工作节点封装成单独的javabean
每个节点需要实现NodeComponent接口,并且实现process无参方法
节点上加上@@LiteflowComponent("节点名称")注解
该注解有两个功能:
(1)标识是个规则引擎节点
(2)创建节点名称,后续通过el表达式中的节点名称定位到具体工作节点
2.执行规则引擎
注入FlowExecutor类,调用execute2Resp方法(也有其他api,这里着重介绍该方法),
方法入参:
3.节点调用顺序如何控制
(1)配合xml文件,xml文件里面规范节点执行顺序,这里不做详细介绍,因为xml配置需要手动添加执行文件,不如配合mysql灵活性
(2)配合mysql灵活读取数据库中表配置的执行顺序
引入依赖
配置文件application.yml
数据库建表
注意,表和字段都可以自定义,只要跟配置文件对应上即可
添加表数据
实际项目应用中,可以通过前端托拉拽框架,灵活配置,将数据写入引擎表中
这里主要关注chain_name和el_data字段
chain_name字段值是前文中调用规则流方法 execute2Resp的第一个入参,框架会根据这个值去数据库中查询el_data字段值,加载到项目中执行引擎任务
执行execute2Resp方法过程中的上下文参数及获取最终返回结果
流程中操作上下文
el表达式--待补充