这几天在学习了activiti一些基本的流程操作之后,在此记录。只有步骤,概念参考官方文档(官方文档看了半天,因为不了解Activiti Explorer所以看到一半…)
参考了网上大佬们的教程,终于摸了个门清。
http://blog.csdn.net/u011320740/article/details/53018040
http://blog.csdn.net/qiumuxia0921/article/details/50988487
前提:eclipse 、maven项目、activiti相关的一大堆jar包、eclipse activiti、mySQL
1.创建activiti.cfg.xml文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 加载配置文件 -->
<!-- <context:property-placeholder location="classpath:jdbc.properties" />
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
连接数据的配置
<property name="jdbcDriver" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="jdbcUsername" value="${jdbc.username}"></property>
<property name="jdbcPassword" value="${jdbc.password}"></property>
没有表创建表
<property name="databaseSchemaUpdate" value="true"></property>
</bean> -->
<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?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="111111"></property>
<!-- 没有表创建表 -->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
备注:如果有用SSM的同学可以直接这样设置
spring-activiti.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
//连接数据库的配置
processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/itcast0711activiti?useUnicode=true&characterEncoding=utf8");
processEngineConfiguration.setJdbcUsername("root");
processEngineConfiguration.setJdbcPassword("root");
/**
public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自动创建表,需要表存在
public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先删除表再创建表
public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自动创建表
*/
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
-->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<!-- 连接数据的配置 -->
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<!-- 没有表创建表 -->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
</beans>
这里直接可以设置流程引擎的数据源和事务管理器,和Spring关联起来。
之后便是设置bean,这样可以在ServiceImpl文件里直接用注解来实例化,很方便。
2.运用activiti diagram画出流程图
流程图设置如下
点击空白处设置ID
设置经理审核的处理人
这里设置的情境是,总经理有多人,任务流程一到总经理审批,总经理们都可以看到这个任务并且处理,只要一个总经理处理了,便继续下一步流程
这里设置了监听器为一个java类
代码如下
package lanqiao.activiti;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
/**
* startProcessInstance()启动流程实例的时候,就会调用TaskListenerImpl中的notify方法,
* 这个时候,就会指定了下一个Assignee。
* @author 寒暄
*
*/
public class ManagerTaskListener implements TaskListener{
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.addCandidateUser("a");
delegateTask.addCandidateUser("b");
delegateTask.addCandidateUser("c");
}
}
这里设置了三个总经理,也就是候选人a,b,c,按道理说,接下来查询a的待办任务(这里到时候查询task的list得用taskCandidateUser(“a”))就可以看到
3.创建流程引擎、部署流程定义
创建流程引擎交给spring来创建了,创建完成之后在数据库里可以看到很多表如下
所以我们需要把刚才画好的流程图部署起来
当然,没用spring的可以这么做(第一个配置activiti.cfg.xml)
//部署流程定义
@Test
public void CreateDeploy(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//加载流程定义文件(流程图)
repositoryService.createDeployment()
.addClasspathResource("diagrams/shenhe.bpmn")
.deploy();
System.out.println(repositoryService.createProcessDefinitionQuery().count());
}
这里我使用了classpathResource的方式,这样要保证和上面文件的放置一样,classpath下的diagrams文件夹里,当然,也可以用zip包装流和io流来部署流程图
部署完成之后,可以发现
这两个表都有记录了,说明部署成功
4.创建流程实例
如果说部署流程定义是公司发布请假流程的规定的话,创建流程定义就是公司的员工小汪去申请请假(实例)。
接下来看代码
@Test
public void instanceA(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.startProcessInstanceByKey("shenhe");
Map<String, Object> map = new HashMap<String,Object>();
map.put("manager", "经理");
runtimeService.startProcessInstanceByKey("shenhe", map);
}
上面的流程图里创建了一个流程变量,所以我们这里需要指定一个manager通过map传过去,查看数据库可以发现
任务列表有需要指定处理人’经理’去完成的任务了
所以接下来–
5.完成任务
这是在每个需要人为确认或操作必须进行的步骤
上一步已经到’经理’去complete任务的步骤了,好,给他个面子,完成掉
@Test
public void complete2(){
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
String taskId = "2505";
taskService.complete(taskId);
}
这里的2505是在没执行前面这段代码之前去数据库里task表找的,在实际的web项目中,应该从前台获取taskId传过来,这样比较实际
好了,完成之后,再看task表
经理完成了他的任务,审核通过了,到了总经理处理这项任务了。
因为总经理我们设置的是监听器,在完成经理审批之后,到,流程走到这里之前,监听器在这时执行notify里的代码,就是之前的类里设置了a,b,c三个候选人
所以我们现在去查看下比如b候选人的任务,会发现什么,代码如下:
@Test
public void select(){
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
List<Task> tasks = taskService.createTaskQuery()
.taskCandidateUser("b")
.list();
for (Task task : tasks) {
System.out.println(task);
}
}
console窗口显示
再看a和c也是同样的结果
接下来我们完成他
@Test
public void complete2(){
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
String taskId = "5002";
taskService.complete(taskId);
}
任务完成,流程实例结束
在数据库的act_hi_taskinst表和act_hi_identitylink表中可以看到(hi表示历史,没问题吧老铁?)
就此结束!
第一次自己写下整篇博客,有不足之处大佬们多多包涵,多给建议,谢啦