系列文章:
Flowable(Activiti)系列之一:中会签(多实例)使用方法以及ExecutionListener和TaskListener的区别
Flowable(Activiti)系列之二:不用自己写代码,使用Flowable-ui的Rest接口
Flowable(Activiti)系列之三:docker运行flowable-ui,存储到mysql/postgres数据库,支持arm64架构
Flowable(Activiti)系列之四:没有数据库创建权限部署flowable(activiti)时完全屏蔽LiquiBase
Flowable/Activiti系列之五:流程引擎远程调用时透传任意复杂的业务对象
以前我们都采用嵌入式使用Flowable/Activiti工作流引擎,这样可能很方便地把任何复杂业务对象传入到引擎里。但现在流行微服务架构,那么就需要把Flowable/Activiti流程引擎单独部署成一个服务,进行远程调用,然而,远程调用时,我们只能传入简单类型的数据,如String, Int等等。有人说它本来就支持传入复杂对象吧,没错,它确实能够传递复杂对象,但复杂对象被系列化存储起来了,最关键的是,你在流程脚本中无法使用它!!!因为服务端没有你的java类,无法反系列化成你的类,举个例子,你有一个如下的User类的对象:
字段名 | 类型 | 示例 |
---|---|---|
name | String | Johnny |
age | int | 30 |
String | johnny@youkuaiyun.com |
你把它存入到流程引擎里,变量名为loginUser,然后你就可以在脚本里这么引用它了:
if (loginUser.age >= 30) {
CURRENT_STATE = 'APPROVED'
} else {
CURRENT_STATE = 'REJECTED'
}
那么,我们如何能让复杂对象传送到引擎里,还能象嵌入式那样自由访问这些对象呢?我的方案是:把复杂对象先转换成Map对象(并加入一个标记字段)传入到引擎中,这样引擎中就可以象访问复杂对象一样的访问它了,回来时,又把有标记字段的Map对象转换成原来的对象类型。当然,这一切要做成一个访问框架,自动完成,对客户端来说是透明的,也就是说,客户端只要简单的把任意对象传给访问框架,访问框架负责把复杂类型对象转换成Map对象,传送给服务端调用服务,返回对象又还原成复杂对象,再返回给调用者。
这个方案我们已经实现并稳定使用很久了,如果有需要代码的,私信我,点赞够100后,我分享代码出来。
依赖项目:分享系列项目的基础项目