背景
某一天一如既往的上班”旅途“中,我的领导在开早会的时候,说我最近没啥事,于是让我研究一下Activiti工作流引擎与Drools规则引擎,当时也不知道后边具体要做什么,管它的,先看看再说。看了几天后,写了个简单的demo出来,结果发现Activiti这个东西不就是可以用来做流程审批的嘛;最后我们就开始开发基于Activiti的工作流引擎。并且部分功能与定时任务调度中心进行整合,实现了简单的流程编排任务。
因为工作流相关的东西在公司的电脑上,公司对于安全保密性十分严格,所以本文不阐述具体实现,只记录一下我当时的实现思路。
调度中心本身有一个子任务的概念,但子任务是有先后顺序的,所以这里不太符合需求。在xxl-job的github上我看到过这样一个issue:
看来还是很多人想要这个功能呢,目前我们先自己实现一个简单的流程任务编排。
实现思路
概念描述
因为涉及到了工作流的东西,在此处只简单介绍一下Activiti工作流引擎。
工作流(WorkFlow),就是”业务过程的部分或整体在计算机应用环境下的自动化“,它主要解决的是”使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现“,简单的说:工作流将一套大的业务逻辑分解成业务逻辑段,并统一控制这些业务逻辑段的执行条件,执行顺序以及相互通信。实现业务逻辑的分解和解耦。
关键概念:
- 服务节点:用户任务,服务任务,接受任务,脚本任务等
- 网关节点:互斥网关,并行网关等
- 逻辑判断节点:类似于if/else
我们在工作流的开发中主要是包装了服务节点以及网关节点和逻辑节点等内容,让服务节点类似于一个http网络请求,触发微服务的接口,同时等待微服务接口返回内容,放入到流程中,执行后边的流程。
思路设计
我在开发调度中心的工作流模式时时通过SDK的方式引入工作流模式,减少系统间的耦合,实现工作流模式后可以做一些简单的编排任务,比如多个Jobhandler的组合执行方式。
下面是方案的设计思路:
大致就是:调度中心与工作流系统之间通过SDK的方式进行通信,调度中心的任务和工作流的任务是相同概念的,都是一次完整的触发过程。调度中心的执行器对应于工作流的服务任务节点,在工作流节点端可以配置相应的Jobhandler,当要执行定时任务时,会首先通过SDK触发工作流任务开始执行,然后执行到调度中心端,在调度中心端去触发相应的业务端相应的Jobhandler,达到执行多任务的效果。
当任务执行完成后我们去回调工作流获取任务状态接口以此来同步调度中心任务的执行状态。
注意点:在我们选择工作流模式配置定时任务的时候,我们不再需要填写Jobhandler参数,只需要绑定工作流的启动key即可,作图的时候直接在服务节点上填写Jobhandler参数。
说明
大体上的思路就是这样,可能比较粗略还有点抽象...,本来想结合一些实际的页面UI以及代码来说明,但因涉及到公司安全的问题,所以只能这样了,因为如果我要本地弄这些,工程量实在有点巨大...
本篇文章记录了一下当时的思路,大致上有这么一种方式可以来实现简单功能,但是增加了一些学习成本,比如工作流引擎相关知识