文章目录
使用步骤
1个插件
在Eclipse中安装activiti插件,通过插件新建Activiti Diagram文件,进行工作流设计
附上离线插件安装包: activiti-designer-5.14.1.zip
1个引擎
ProcessEngine对象,Activiti 工作流引擎。这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
所有的操作都是从获取引擎开始的,所以一般会把引擎作为全局变量
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
1个配置文件
activiti-context.xml.Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数.
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
http://www.springframework.org/schema/osgi-compendium
http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"
xmlns:p="http://www.springframework.org/schema/p">
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl">
<value>jdbc:mysql://主机名:3306/test2?<![CDATA[useUnicode=true&characterEncoding=utf-8]]></value>
</property>
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="密码" />
<property name="databaseSchemaUpdate" value="true" />
<property name="databaseSchema" value="ACTIVITI"></property>
<!-- 生成流程图的字体 -->
<property name="activityFontName" value="宋体" />
<property name="labelFontName" value="宋体" />
</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" />
<bean id="formService" factory-bean="processEngine"
factory-method="getFormService" />
</beans>
1次初始化
ProcessEngines.init();
生成23张数据库表
5种数据库表
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。
ACT_RE_*: 'RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
ACT_RU_*: 'RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI’表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。
ACT_GE_*: 通用数据,用于不同场景下,如存放资源文件。
23张表
灰色选中的部分就是自动生成的表.
7项Service
- repositoryService:流程仓库service,用于管理流程仓库,增删改查流程资源.
- runtimeService:运行时service,处理正在运行状态的流程实例,任务等.
- taskService:任务service,管理,查询任务,例如办理业务,指派代理人,
- historyService:历史service,可以查询所有历史数据,例如,流程实例,任务,活动,变量,附件等。
- managementService:引擎管理service,和具体业务无关,主要是查询引擎配置,数据库,作业等。
- identityService:身份service,可以管理和查询用户,组之间的关系
- formService:表单service,处理正在运行状态的流程实例,任务等。
常用基本操作
设计流程图(各种组件,如连线、用户任务、网关)
进入diagram文件进行设置.
- 修改文件id
- 画好工作流,设置代理人
流程定义增删改查
可视化增删改查,不截图了
流程变量增删改查
使用el表达式就好.
启动流程定义
// 部署流程图,负责流程的部署和抓取对应的流程图
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
//写你自己的文件路径
deploymentBuilder.addClasspathResource("com/qianfeng/workflow/resources/ask.bpmn");
deploymentBuilder.deploy();
任务增删改查
添加任务:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// runtimeService 启动流程相关的操作 获取流程实例的操作
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> map = new HashMap<>();
map.put("inputuser", "部门经理1");
// 通过流程变量 员工角色
// 这里的key要与流程图的Id保持一致
map.put("role", "staff");
map.put("pass","yes");
runtimeService.startProcessInstanceByKey("ask", map);
查询代理人持有的任务:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskServer = processEngine.getTaskService();
List<Task> tasks = taskServer.createTaskQuery().taskAssignee("部门经理1").list();
for (Task task : tasks) {
System.out.println("taskID:" + task.getId());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("创建时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(task.getCreateTime()));
}
完成当前任务,并将任务交给下一个代理人:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskServer = processEngine.getTaskService();
List<Task> tasks = taskServer.createTaskQuery().taskAssignee("部门经理1").list();
for (Task task : tasks) {
System.out.println("taskID:" + task.getId());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("创建时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(task.getCreateTime()));
}
完成任务的同时添加批注,并将任务交给下一个代理人:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
taskService.addComment("7508", "7505", "yes", "好的");
taskService.complete("7508");
查看流程实例的批注:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Comment> comments = taskService.getProcessInstanceComments("");
for (Comment comment : comments) {
System.out.println(comment.getFullMessage());
System.out.println(comment.getType());
}
删除流程实例,根据部署ID删除
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 写下true就是删除 部署流程相关的数据
processEngine.getRepositoryService().deleteDeployment("deploymentId", true);
通过Controller将当前工作流显示在工作流图片中
ask.png
@RequestMapping(params = "method=getProcessModel", method = RequestMethod.GET)
public String getProcessModel(ModelMap model, String taskid) {
// 根据taskid获取到task实例再获得到流程实例ID 流程定义ID
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Task task = processEngine.getTaskService().createTaskQuery().taskId(taskid).singleResult();
String processinstanceid = task.getProcessInstanceId();
String processDefinitionId = task.getProcessDefinitionId();
ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine().getRuntimeService()
.createProcessInstanceQuery().processInstanceId(processinstanceid).singleResult();
ProcessDefinition processDefinition = ProcessEngines.getDefaultProcessEngine().getRepositoryService()
.getProcessDefinition(processDefinitionId);
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) processDefinition;
ActivityImpl activityImpl = processDefinitionEntity.findActivity(processInstance.getActivityId());
model.put("deploymentId", processDefinition.getDeploymentId());
model.put("imageName", processDefinition.getDiagramResourceName());
model.put("width", activityImpl.getWidth());
model.put("height", activityImpl.getHeight());
model.put("x", activityImpl.getX());
model.put("y", activityImpl.getY());
return "image";
}