vlambda博客
学习文章列表

不使用工作流引擎实现简单工作流

作流引擎给系统开发带来了很多便利,让技术人员不用太关注业务流程控制,专注于业务逻辑实现,但它也带来一些问题。比如业务办理过程会产生数十倍的工作流数据,导致表空间占用过大;报表查询需要关联工作流中的信息,导致性能降低;工作流异常中止时,导致业务流程无法继续;缺少工作流专家,工作流问题难以解决;工作流引擎太重,多数简单流程用不上那么复杂的功能。

有没有办法在不使用工作流引擎的情况下,又能实现简单的工作流呢?我早几年看过前同事雄哥写的代码,那是一个带有工作流的自动任务高手写的代码看起来赏心悦目用自己实现的简单工作流,把集中支付业务的财政报文校验、账务处理、结果报文组装发送、数据库更新的环节串起来了自动任务开始一次轮询时,每一个后续环节处理类会根据数据库流程配置信息自动调起。不得不说,银行的软开牛人挺多的。

在我模糊的印象中,他是这么做的它的处理流程是一个单项链表,数据库中配置好当前处理类对应的下一个处理类,Start状态开始处理,代码中用getBean拿到下一个处理类实例,用反射调用方法传入参数,直到End状态,结束流程。

我们可以借鉴这个办法,用状态切换来实现一个简单的工作流。

首先定义一张业务状态表,把涉及到的业务状态编个码。

业务状态表的值域可能是这样的。

不使用工作流引擎实现简单工作流

然后定义一张操作类型表,把所有可能的操作编个码。

不使用工作流引擎实现简单工作流

操作类型表的值域可能是这样的。

接着定义一张流程配置表,放缓存里存储的数据类似一张链表。

每种业务状态定义对应的方法处理某个状态的业务。在业务逻辑处理完毕之后根据区划代码、当前业务类型、状态和操作类型代码查询下一步的业务状态更新业务数据状态同时在业务数据中更新操作人和操作意见。另外用一张业务操作日志表,记录所有操作的过程信息。

这种处理方式,虽然业务表中存放了操作信息的内容属于反范式设计,它能简单模拟工作流引擎最核心的功能,提升性能减少数据总量,业务处理类也不用写死下一步要赋值的状态代码。更重要的是,它不依赖工作流引擎,完全可控