文章目录
前言
Activiti流程引擎是一项新的基于Apache许可的开源BPM平台,从基础开始构建,意在提供支持新的BPMN 2.0标准,供人们简单方便使用。它其实可以简称为工作流,也就是一个固定的流程模板,它支持对象管理组、定义流程、控制流,广泛用于开发中。话不多说,直接上
一、相关配置及建库建表
1.引入jar包
maven配置jar,JDK版本1.8, 数据库是Mysql,开发工具是idea
<dependencies>
<!--JUnit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--- Activiti依赖导入 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-core-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
这里我贴上了我的demo的所有的包,自行挑选
2.配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?createDatabaseIfNotExist=true&useUnicode=true&serverTimezone=UTC&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="123456"></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
在resources下配置一下数据库的连接,因为Activiti会自动去建表,配置文件最好取名为activiti.cfg.xml 这样就可以被自动给加载到
3.建Activiti自带的数据库
如果你的配置文件不是上面那个默认的名字,那么就用这个方法,只需要把名字替换成你的配置文件即可
我更喜欢这种,一步到位的,只要配置文件名字是activiti.cfg.xml,那么就可以用ProcessEngines来做很多事,可以通过ProcessEngines获取Activiti的服务大管家,继而可以得到Activiti相关的服务来操作了,用的地方会非常多,所以建议抽取出来,因为是demo大多copy,这里我就不抽取了
运行后就得到他们了,hi代表历史数据表,re代表仓库表,ru代表运行时相关数据的表,具体也在这里细说了,可以自行百度
下面就去搞搞流程图吧
二、流程图相关
这里是碰到坑最多的地方,因为idea实在是对这个流程图确实不太友好,老乱码了,并且不要用idea的社区版,因为功能插件也很少,无法支持流程图全程的操作
1.首先安装插件
找到这个插件安装起来
如果找不到,就只有去浏览器上下载了,我就是这样,一搜就能找到,下载完成后,就添加到idea中去,操作如下:
选中到你刚刚下载的插件的包上,点击🆗就好了
然后会提示重启
重启之后就能看到可以添加bpmn文件了
2.画第一个最简单的流程图
将右侧的图标直接拖到中间来,流程开始时绿点,结束是红点选择usertask拖过来,一会儿对流程节点进行定义,将鼠标对准图标的中心黑点,即可对图标之间进行连线
3.对流程节点定义
请假申请
请假审批
给流程取个名,类似于key,后面一些操作会用到
4.将流程部署起来
注意:
我们目前只有一个bpmn文件,如果直接开始部署,虽然Activiti底层会自动根据这个bpmn文件生成一张对应的png图片,但是会乱码,所以我们需要自己准备一张对应bpmn文件的png图片,就用咱们刚刚画的bpmn文件来转成png,选中我们的bpmn文件将它复制一份放在resources下,后缀改为xml,然后进行下面的操作即可将xml转为png图片
如果你的idea没有Diagrams的话,下载一个jbpm插件即可
这样就得到对应咱们bpmn文件的png图片了,在这可能大家又会遇到png图片乱码问题,可以去百度一下bpmn转png乱码解决方式
接下来继续保存到resources下,这样就得到了
现在咱们上代码—部署流程
//获取服务大
// 管家
public ProcessEngine getProcessEngine() {
return ProcessEngines.getDefaultProcessEngine();
}
//部署流程
@Test
public void deployProcess() {
//获取服务大管家,通过ProcessEngines来获取管家的话,只要resources下有activiti.cfg.xml同名的配置文件,就会自动加载并建库
ProcessEngine defaultProcessEngine = getProcessEngine();
//获取相关服务(仓库服务)
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//获取部署对象
DeploymentBuilder deployment = repositoryService.createDeployment();
//流程图取名并添加到对象
deployment.name("请假流程").addClasspathResource("QingJia.bpmn").addClasspathResource("QingJia.png").deploy();
//部署
Deployment deploy = deployment.deploy();
System.out.println("Id: " + deploy.getId());
System.out.println("Name: " + deploy.getName());
System.out.println("DeploymentTime: " + deploy.getDeploymentTime());
}
就可以在数据库中看到数据了
5.启动第一个流程
通过key启动,key就是画流程图时给图取名的词,咱们用的Hello
//启动流程
@Test
public void getStart() {
//获取服务大管家
ProcessEngine defaultProcessEngine = getProcessEngine();
//获取相关服务(运行时服务)
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
String key = "Hello";
//启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key);
System.out.println("流程name为: " + processInstance.getName());
System.out.println("流程实例ID为; " + processInstance.getId());
}
6.查询私有任务
流程就启动起来了,现在走到我们开始定义的请假申请节点
执行人是柒柒,咱们来查询一下柒柒的私有任务,看看有没有
//查询任务-私有任务
@Test
public void viewPersonTask() {
ProcessEngine defaultProcessEngine = getProcessEngine();
TaskService taskService = defaultProcessEngine.getTaskService();
//创建查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
//查询条件
String assignee = "柒柒";
taskQuery.taskAssignee(assignee);
List<Task> list = taskQuery.list();
System.out.println(list);
}
7.执行任务
执行完毕之后,再去查询柒柒的私有任务,就已经没有了,流程已经走到了我们设定的审批节点,执行人为老夏,那么重复查询私有任务代码,名字改为老夏,就能看到了,然后将得到的任务id,再放到办理任务中去执行,老夏也就完成了任务,最后因为流程已经没有了任务节点,这个流程自动结束了
//办理任务
@Test
public void completeProcess() {
//获取管家
ProcessEngine processEngine = getProcessEngine();
//获取对应服务(任务服务)
TaskService taskService = processEngine.getTaskService();
String taskId = "2504";
//办理任务
taskService.complete(taskId);
}
8. 查询流程部署列表
这里可以直接获取到部署过的所有的流程
//查询流程定义列表
@Test
public void getList() {
ProcessEngine defaultProcessEngine = getProcessEngine();
//获取相关服务(仓库服务)
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//获取查询对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//添加查询条件
//...//
List<ProcessDefinition> list = processDefinitionQuery.list();
for (ProcessDefinition pd : list) {
System.out.println("id-->" + pd.getId());
System.out.println("name-->" + pd.getName());
System.out.println("key-->" + pd.getKey());
System.out.println("version-->" + pd.getVersion());
System.out.println("resourceName-->" + pd.getResourceName());
System.out.println("DeploymentId-->" + pd.getDeploymentId());
System.out.println("DiagramResourceName-->" + pd.getDiagramResourceName());
System.out.println("category-->" + pd.getCategory());
System.out.println("Description-->" + pd.getDescription());
}
}
9. 获取流程定义的资源文件
这里可以将我们放在数据库的流程png图片,通过流输出到任意位置,就是说能够查看流程图片
//获取流程定义的资源文件
@Test
public void getView() throws IOException {
//获取服务大管家,通过ProcessEngines来获取管家的话,只要resources下有activiti.cfg.xml同名的配置文件,就会自动加载并建库
ProcessEngine processEngine = getProcessEngine();
//获取相关服务(仓库服务)
RepositoryService repositoryService = processEngine.getRepositoryService();
String deploymentId = "15001";
List<String> deploymentResourceNames = repositoryService.getDeploymentResourceNames(deploymentId);
String resourceName = null;
for (String deploymentResourceName : deploymentResourceNames) {
if (deploymentResourceName.indexOf(".png") >= 0) {
resourceName = deploymentResourceName;
}
}
if (resourceName != null) {
//指定目录
File file = new File("C:\\Users\\xiashaoqi\\Desktop\\"+resourceName+".png");
InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
FileUtils.copyInputStreamToFile(resourceAsStream,file);
System.out.println("文件保存路径为: "+file.toString());
}
}
10.删除流程部署
这里可以将我们部署的流程进行物理删除,无法恢复,被删除只能重新部署,最好是进行逻辑删除,类似于商品的上下架,就不贴上来了,各位看客可以开始自行尝试了
//删除流程定义
@Test
public void delTest(){
ProcessEngine processEngine = getProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
String id = "12501";
repositoryService.deleteDeployment(id);
System.out.println("删除流程成功");
}
private String getDateStr(Date date){
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.format(date);
}
总结
一个最最简单的单线流程就搞定了,总结一下,流程的部署,启动,删除,任务的查看,办理等等操作,都是由对应的服务来进行的,有什么需求,找到对应的服务调出对应的方法即可,这里只是个入门而已,后续还有超级多的东西等着我们,先去把25张表整明白,流程实例,流程变量…