这只是一篇非常粗浅的记录我对工作流引擎认识的文章。                   另见:

Activiti工作流引擎使用

www.open-open.com/lib/view/open1350460225367.html

知道工作流引擎是很久之前了,但是一直都没有机会尝试,一是没有业务上的需要,二是感觉工作流入门不容易。最近,项目中用到了一点工作流的东西,虽然我没有具体参与,但是了解一下还是好的。于是抽周末两天时间读了一些文章和jBPM以及Activiti的User Reference,本文做一下记录。SWF指的是Amazon Simple Workflow。

工作流引擎是什么?

“工作流引擎”这个名字听起来很吓人(“引擎”这两个字眼总是能吓人的),我之前就是被吓着了的程序员中的一个。百度词条"工作流引擎"也很难懂。

我们经常做一些程序,比如用户A填一张表,提交后,会给另一个用户B(通常是另一类较色)审核,他们觉得没有问题就确定,最后给原来A用户发送一封邮件。在实现这一类系统时我们会设计一张任务表,这个表中有一列成为Status(状态):用户提交后状态是0,审核通过后状态是1,审核没通过状态是2。但是这样设计会有一些扩展性的问题,比如:

  • 我需要知道某表单的历史信息:什么时候由谁提交、什么时候被审核通过、被谁审核通过等
  • 我需要扩展或者改动流程:A用户提交表单后,B用户希望能收到邮件提醒等
  • 我需要定时执行一些任务:为A用户提交表单设置截止时间,提前截止时间一天发送邮件通知

注:这些需求用土鳖的方式是都可以实现,我以前在学校工作的时候,买设备走学校的采购流程系统,我就亲眼看到一个工作人员打开SQL Server去数据库中查询这个订单是什么时候下的。

当然,这样的系统做得多了,就会对这些进行归纳抽象,比如:

  • 将任务状态表和历史记录表抽象出来成为 TaskService 和 HistoryService 模块
  • 将定时任务以及抽象成 BusinessCalendar 模块
  • 将用户管理的部分抽取出来成为 Identity 模块
  • 将发送邮件抽象成 EmailTask 模块,使用的时候只需要配置一下收件人和内容即可
  • 将需要调用Java类处理业务逻辑功能抽象成 Action,使用时配置一下具体调用哪一个Java类
  • 最后做一个流程管理的通用界面,能实时监控流程的执行情况

这些也都是jPBM以及Activiti等工作流引擎的核心模块。

工作流引擎的基本概念

上一节所述A和B参与的工作流的例子,很好的描述了一个A和B的工作流程,我们用一种语言来将这种模式描述出来,jBPM5之前版本用的是jPDL,现在大家都用BMPN,两者大同小异,都是用XML来描述流程,也都有可视化设计器支持,不过BMPN是行业标准。

编写好流程定义(Process Defintion)文件以及相关的Java类后,就可以部署到引擎中,每一次执行称为一个流程实例(Process Instance)。

工作流有版本的概念,jBPM和Activiti上传一个新的版本后,版本号会增加1,旧版本还没执行完的流程实例还会继续执行。SWF的版本是个字符串,随意指定好了,这样也很好,字符串名称更明确。

前面提到工作流抽象出来的各个模块,他们之间也是需要相互交互的,比如 EmailTask 就需要调用 Identity 模块来查找用户的Email信息、用户的姓名等。因此需要一个流程上下文(Process Context)来协调。

最后,流程的各个Task(或者称为Activity)之间可能要共享一点信息,jBPM和Actviti都有流程上下文实例(Process Context Instance)的概念,很像一个Hash,存放key-value信息,当然比Hash更强一点的是,流程上下文实例支持作用域的概念。

工作流引擎的组成部分

流程定义

所谓流程定义即使用XML编写的用于描述流程的文件,你需要掌握一些BMPN的知识。很多工作流引擎都带有可视化流程设计器,但是需要理解的是,背后其实还是XML,下面是一个定义了4个结点的示例。

<process id="myProcess" name="My process" isExecutable="true"><startevent id="start" name="Start"></startevent><endevent id="end" name="End"></endevent><scripttask id="script" name="Script Task" scriptFormat="javascript" activiti:autoStoreVariables="true"><script>execution.setVariable("message", "Hello")</script></scripttask><servicetask id="service" name="Service Task" activiti:class="com.zhlwish.activity.demo01.HelloAction"></servicetask><sequenceflow id="flow1" sourceRef="start" targetRef="script"></sequenceflow><sequenceflow id="flow2" sourceRef="script" targetRef="service"></sequenceflow><sequenceflow id="flow3" sourceRef="service" targetRef="end"></sequenceflow>
</process>

定以好流程后,就可以发布到工作流引擎,工作流引擎负责解析这个XML,并且存到数据库中。我们通过API来启动一个流程。

API

对于苦逼的程序员来讲,API就是一切,不过经过抽象后的API也不复杂,基本上还是前面前面一节所述的概念的抽象。下面是Activiti工作流引擎部署流程定义文件,并启动一个流程的示例代码:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment().addClasspathResource("Demo1.bpmn").deploy();RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");

流程启动后,可以通过API来对流程进行控制,如触发一个消息等待任务(receiveTask),甚至是将任务分配给某个用户,获取某个用户的所有任务等。

List<task> tasks = taskService.createTaskQuery().taskAssignee("admin").orderByDueDate().asc().list();

这段代码是查询admin用户的所有任务,按照截止时间升序排序,也就是最紧急的放在最前面。

嵌入式部署与独立

嵌入式部署即将流程引擎嵌入部署于Web应用中,这是最容易也是最简单的方式,通过上面的API就可以实现。

独立部署即流程引擎被独立运行,Web应用通过Rest API或者其他方式调用流程引擎的接口。Activiti引擎实现了一套Rest API,SWF也实现了完整的API结构,包括各个语言的版本。

独立部署的好处就是,引擎独立运行,和外部系统很好的解耦了,外部系统的故障不会导致工作流引擎的崩溃。

SWF

SWF与其说是工作流引擎,不如说是分布式计算调度框架,SWF中只包括Task和History两部分,甚至是每个Task之间如果要传递一些数据的话,都只能通过第三方存储(比如Message Queue或者Redis),不过这也给了编程更大的灵活性,问题是这种灵活性是不是非常需要。

一个SWF由Worker和Decider组成,Worker执行实际的任务,而Decider进行流程控制,两者严格上来讲没有区别,只是所执行的任务不同罢了。每个Worker和Decider会定期的去SWF的一个Task List取下一个任务。可以看出来这更像是一个“多线程”的结构,而SWF官方网站的Use Case是NASA的火星探索计划中需要处理图片的系统,这其实也是一个更多侧重于计算的系统,流程反而非常简单。

另外,SWF(Simple Workflow)的一个Workflow不能太复杂,因为所有的流程控制都集中于Decider,如果太复杂的话Decider将无比庞大,给维护和扩展带来一定的困扰。

Java工作流引擎:jBPM、Activiti以及SWF相关推荐

  1. Java工作流引擎节点接收人设置“其他方式总结”系列讲解

    关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统CCBPM节点访问规则接收人规则 适配数据库: o ...

  2. java工作流引擎,roadflow(一个强大的工作流引擎)

    JAVA工作流引擎(J-RoadFlow) J-RoadFlow工作流平台是知名的.NET工作流引擎RoadFlow的JAVA移植版.该工作流平台由从事多年OA和工作流实施及开发的团队研发, 采用最简 ...

  3. java工作流引擎Jflow流程事件和流程节点事件设置

    流程实例的引入和设置 关键词: 开源工作流引擎  Java工作流开发  .net开源工作流引擎   流程事件 工作流节点事件 应用场景: 在一些复杂的业务逻辑流程中需要在某个节点或者是流程结束后做一些 ...

  4. java工作流引擎证照库类型的流程设计 实现方案与演示案例

    关键词: .Net开源工作流    工作流引擎   工作流引擎常用信息存储  流程前置导航 证照库的概念&应用场景: 我们在梳理流程的时候,会发现有一些流程的发起是基于一个实体信息的. 比如: ...

  5. LeaRun .Net Core/Java工作流引擎,分离式前端,升级Vue

    流程作为企业管理系统的核心,在企业的发展过程中具有重要的作用.通常来说,一个完整的流程大致包括有工作流引擎.工作流设计器.流程操作.客户界面.流程监控.表单设计器.表单集成以及与应用程序集成等. 工作 ...

  6. 基于Java工作流引擎,集团应用模式用户组功能设计与实现

    关键字 驰骋BPM ,工作流开发框架,用户组,接受人规则,用户组发起人范围,选择人范围. 集团工作模式. Ccflow ,jflow.工作流引擎 名词定义与应用背景 对于集团模式的ccflow,jfl ...

  7. LeaRun.Java工作流引擎 快速开发业务流程

    工作流引擎是用来开发工作流转的框架.作为应用系统的一部分,能根据角色.分工和条件的不同决定信息传递路由.内容等级等核心解决方案,包含组织结构.流程.节点.转向规则等. 而低代码开发框架,是能够解决一个 ...

  8. 【Spring注解驱动开发】java工作流引擎框架

    第1部分:基础篇 第2部分:开发篇 第3部分:优化篇 第4部分:管理维护篇 最后 由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM.Java并发.微服务. ...

  9. spring boot vue java工作流引擎j-roadflow测试环境搭建

    1.从j-roadflow官网下载测试环境jar包. 下载地址:http://www.roadflow.cn/j-roadflow-2.0.0.zip 下载后解压里面有j-roadflow-2.0.0 ...

  10. Activity java工作流引擎 maven依赖

    版本 <activiti.version>5.15.1</activiti.version> <!-- activiti-engine --><depende ...

最新文章

  1. 使用MATLAB实现的小算法练习1
  2. kali使用openvas
  3. Java学完可以应用在什么领域?这8大领域你要知道
  4. boost::uuid::nil_generator相关的测试程序
  5. 使用SAP Spartacus的route给标准页面维护alias入口
  6. ASP.NET AJAX入门系列
  7. 洛谷P5050 【模板】多项式多点求值
  8. 对象str()与reper()转换为字符串
  9. Android 反编译Apk修改资源文件并重新打包
  10. Quartus II13.0的破解过程
  11. 学田岛电脑绣花制版新人上手教程之一
  12. Apache启动失败,请检查相关配置。√MySQL5.1已启动。
  13. Mac 安装 idb 和 idb_companion
  14. 回归预测 | MATLAB实现Robust-ELM鲁棒极限学习机多输入单输出
  15. 虚拟服务器和vdi,比较瘦客户端和VDI
  16. excel离散度图表怎么算_excel离散数据表格-Excel 离散程度分析图表如何做
  17. STP生成树协议切割网络环路
  18. java的逻辑判断和结构
  19. JavaScript百炼成仙1.16 数组方法
  20. 我大121321321321321

热门文章

  1. 数据结构与算法分析(一)基础部分与算法分析方法
  2. 在使用renderTo中遇到的Uncaught TypeError: Cannot read property 'insertAdjacentHTML' of null
  3. 怎么才可以使用 IPX 协议???
  4. 计算机网络——常用的网络命令
  5. 飞信2008协议抓包(1)
  6. 快解析v6.5.3版本,添加端口映射教程
  7. 电脑进入pe时蓝屏_进入PE系统就蓝屏怎么办?
  8. mybatis批量操作(批量查询,批量插入,批量更新)
  9. oracle创建表空间
  10. html数值计算计算