前言
- 现在越来越多的项目开始使用工作流来满足日常的工作了。今天我们看看Activiti的工作流,我们先入门下BPMN绘画
环境安装
- 关于流程的BPMN文件主要还是通过eclipse开发工具进行集成绘画的。idea中主要是actiBPM绘画的,但是2014年之后actiBPM就不在维护了,现在直接是无法在新的idea版本中安装使用了。
- 既然如此你可以idea开发项目,通过eclipse绘制,但是这种情况好像很麻烦。这里推荐另外一个集成工具绘制BPMN流程图示
- camunda-modeler就是一个第三方的流程设计工具。他的好处是替代了eclipse , 我们可以通过idea的External Tools方式加载进来。
- 关于他的配置也是很简单的
- 剩下的我们就可以绘制了。
扩展
- 关于类似camunda第三方流程绘制的软件,大多都会提供社区办。他们是以java服务的方式启动的。为什么还需要这种方式呢?因为靠着这种方式我们可以通过调用api的方式通过camunda来绘制流程。在我们的自己的流程平台中就可以绘制了。这样就将流程绘制器接入到我们自己的平台系统中了。
发布流程
- 首先我们通过camunda进行绘制一个简易的流程。上面我们先通过tomcat形式启动一个camunda平台,将我们制作的流程发布上去。
服务任务
- 首先我们的刷卡付款这个动作是服务端操作。这里我们点击后右侧设置栏中设置器服务方式
- 最终服务端是通过监听的方式来获取节点信息的,所以这里我们需要设置下消息类型(Topic)。
网关
- 现在我们的流程还是很简单的。上面我们通过设置Implementation的方式为External表示该节点借助外部服务来共同实现且指定消息主题topic 。 关于消息的监听我们下方通过Java方式来监控信息。在流程中还有一个重要角色就是网关 。 这里的网关就是我们的判断节点。比如我们上面刷卡付款请求存在这么一种需求
- 付款金额大于等于1000元时需要进行付款审批。小于1000元则可以直接进行付款。
- 在camunda中有个×的图形,就是我们所说的网关。我们稍微修改下流程图
- 网关我们直接拖拽进来就可以了,他的特色就是存在两条或者更多条分支。那么最终会走哪一个分支就需要我们在每个分支上设置条件了。这里我们通过Java的表达式设置条件。
- amount这就是一个变量。这个变量你可以随意定义,但是在流程开始的时候必须提供这个变量,否则会报错
- 我们可以在网关开始前,先让用户提供先流程的必要信息
- 然后才会根据填写的金额进行扭转流程。付款审批需要根据流程信息进行审批,所以在填写申请单上我还加了item这个参数。为什么加上这个参数呢?假如我是批准付款的负责人。但是我不是很关心金额的事情,或者说我对某些项目就是无脑的通过。这个时候我们可以借助流程的自动化决策来实现该节点的自动审批。
- 这里我们引入流程的DMN,我们通过camunda新建一个DMN文件。并设置dmn的id
- 然后点击左上角的图标进行设置规则
-
我们的规则很简单,凡是item-xyz项目的我都会审批通过,否则一律不通过。
-
在这个规则中我们可以设置很多中方式,上面我们的是唯一方式,也就是说每种条件是互斥的,非黑即白的。还有其它的方式我们可以自己调试下
-
在回到我们主流程中,我们选择Implementation方式为DMN , 并且ref选择上面我们设置的DMN的id
Java监控流程信息
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
复制代码
- 我们这里添加依赖后,开始监听我们流程的topic对应流程里的外部服务
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest")
.asyncResponseTimeout(10000) // 长轮询超时时间
.build();
// 订阅指定的外部任务
client.subscribe("charge-card")
.lockDuration(1000) // 默认锁定时间为20秒,这里修改为1秒
.handler((externalTask, externalTaskService) -> {
// 将您的业务逻辑写在这
// 获取流程变量
String item = (String) externalTask.getVariable("item");
Long amount = (Long) externalTask.getVariable("amount");
LOGGER.info("Charging credit card with an amount of '" + amount + "'€ for the item '" + item + "'...");
try {
Desktop.getDesktop().browse(new URI("https://docs.camunda.org/get-started/quick-start/complete"));
} catch (Exception e) {
e.printStackTrace();
}
// 完成任务
externalTaskService.complete(externalTask);
})
.open();
复制代码
- 此时我们可以查看下日志,
Maltcloud集成
- 工作流在maltcloud版本计划中是排在二期进行的,所以我是在maltcloud完成了基本的功能之后开发计划开发工作流的相关操作。首先就是流程的绘制,上面已经提到了流程的基本绘制及发布。下面我们看看如何将工作流继承到我们的企业级框架maltcloud中吧。
- 注意在整合的时候需要springboot和camunda版本匹配。官网给我们提供了响应版本的匹配方案
- 这里解释一下
- 第一列【springboot starter version】表示camunda的springboot starter版本。
- 第二列【camunda platform version】表示实际的camunda版本
- 第三列【springboot version】表示我们系统的springboot版本。
- 结合maltcloud使用的是2.2.2.RELEASE版本,我们可以定位到使用camunda springboot starter版本应该是3.4.x; 然后我们在去maven仓库中查看下相关的版本
- 这里我一开始选择使用3.4.0的版本。后来发现2.2.x.RELEASE的springboot也支持7.13.x , 最终决定使用7.13.0这个版本。
- 因为camunda-bpm-spring-starter中使用的mybatis使用的是3.5.3但是maltcloud中使用的是3.5.6版本。所以我这里还需要解决下冲突。最终pom配置如下
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<camunda.spring-boot.version>7.13.0</camunda.spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.github.zxhtom</groupId>
<artifactId>org.components.datasource</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
<version>${camunda.spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
<version>${camunda.spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>${camunda.spring-boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
复制代码
- maltcloud是笔者设计的一个企业级开发框架,暂时还在开发阶段,待合适的时期开源。这里我引入了maltcloud平台中的datasource模块。这个模块主要就是引入mybatis的配置。读者可以把这段去掉自行配置mybatis就可以了。
细节补充
- 通过options选择版本。在Installation Procedure中就可以下载指定的版本了。点进去之后会有小版本列表。因为我们maltcloud中选择的是7.13.0 。 所以我们下载对应的平台camunda.