有关activiti的部署已经实现详情见上一篇,接下来进行流程定义

  • 一、流程定义

首先选中存放图形的目录(本次我们选择 resources 下的 diagram 目录),点击菜单:New-BpmnFile,如下图所示:

java使用Activiti工作流 activiti工作流教程_java使用Activiti工作流


名称定义为holiday(默认扩展名为 bpmn),就可以看到进入了流程设计页面,如图所示:

java使用Activiti工作流 activiti工作流教程_java使用Activiti工作流_02


拖动右侧菜单栏菜单,绘制流程图,如下图所示,

java使用Activiti工作流 activiti工作流教程_java使用Activiti工作流_03


我们可以根据自己的流程将其改为相应的汉字,如下图所示:

java使用Activiti工作流 activiti工作流教程_java使用Activiti工作流_04


将图标连接起来,流程id设置为holiday,name为请假流程,如下图所示:

java使用Activiti工作流 activiti工作流教程_当前用户_05


指定任务的负责人,选定节点后设置Assignee值,如下图所示:

java使用Activiti工作流 activiti工作流教程_System_06


画完图后会发现没有png文件,这时我们需要将bpmn文件重命名为xml文件,把后缀改成xml,如下图所示:

java使用Activiti工作流 activiti工作流教程_当前用户_07


重命名完成后,右击如下图所示:

java使用Activiti工作流 activiti工作流教程_当前用户_08


然后保存到与刚才创建文件的一个文件夹内就可以了

java使用Activiti工作流 activiti工作流教程_java使用Activiti工作流_09

java使用Activiti工作流 activiti工作流教程_System_10


保存图片后,发现图片中文乱码,解决方法:

找到IDEA的安装目录,找到bin目录

比如我的路径:D:\develop\IntelliJ IDEA 2018.3\bin

找到这两个文件

java使用Activiti工作流 activiti工作流教程_重启_11

具体要修改哪个文件,由你安装的IDEA的版本来决定,如果你安装了64位版本的IDEA,那么就修改2,具体修改方法:在文件后面追加一条命令:

-Dfile.encoding=UTF-8

java使用Activiti工作流 activiti工作流教程_重启_12


注意:不要有任何空格,否则重启IDEA时会打不开,重启IDEA,把原来的png图片删掉,再重新生成,即可解决乱码问题。

  • 二、接下来编写代码部署流程定义
    部署流程定义就是要将上边绘制的图形即流程定义(.bpmn)部署在工作流程引擎 activiti 中,方法如下:
public static void main(String[] args) {
                    // 1、获取ProcessEngine对象
                    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                    // 2、获取RepositoryService资源
                    RepositoryService repositoryService = processEngine.getRepositoryService();
                    //3、部署流程
                    Deployment deployment = repositoryService.createDeployment()
                            .addClasspathResource("diagram/holiday.bpmn")
                            .addClasspathResource("diagram/holiday.png")
                            .name("请假流程")
                            .deploy();
                    System.out.println(deployment.getName());
                    System.out.println(deployment.getId());
                }

运行程序,部署完成后activiti操作的表如下
act_re_deployment: 部署信息
act_re_procdef :流程定义的一些信息
act_ge_bytearray: 流程定义的bpmn文件以及png文件

  • 三、部署流程实例
    流程定义部署在 activiti 后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了。针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于 java 类与 java 对象的关系,类定义好后需要 new 创建一个对象使用,当然可以 new 多个对象。对于请假申请流程,张三发起一个请假申请单需要启动一个流程实例,请假申请单发起一个请假单也需要启动一个流程实例。代码如下:
// 1、获取ProcessEngine对象
     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     // 2、获取RuntimeService资源
     RuntimeService runtimeService = processEngine.getRuntimeService();
     // 3、创建流程实例ProcessInstance
     ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidays");
     System.out.println("部署流程ID:"+processInstance.getDeploymentId());
     System.out.println("流程实例ID:"+processInstance.getId());
     System.out.println("活动ID:"+processInstance.getActivityId());

运行程序,启动流程实例完成后activiti操作的表
act_hi_actinst: 已完成的活动信息
act_hi_identitylink: 参与者信息
act_hi_procinst: 流程实例
act_hi_taskinst: 任务实例
act_ru_execution: 执行表
act_ru_identitylink: 参与者信息
act_ru_task: 任务

  • 四、任务查询
    流程启动后,各个任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
/**
 - 任务查询
*/
public class ActivitiTaskQuery {
public static void main(String[] args) {
// 1、获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取TaskService资源
TaskService taskService = processEngine.getTaskService();
// 3、根据流程定义的key、负责人assignee来实现当前用户的任务列表查询
List<Task> taskList = taskService.createTaskQuery().
processDefinitionKey("holidays").
taskAssignee("zhangsan").list();
for (Task task : taskList) {
System.out.println("流程实例ID:"+task.getProcessDefinitionId());
System.out.println("任务ID:"+task.getId());
System.out.println("任务负责人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
}

执行程序,运行结果如下:得到任务ID

java使用Activiti工作流 activiti工作流教程_重启_13

  • 五、任务处理
    任务负责人查询出待办任务,选择任务进行处理,完成任务。
/**
* 完成任务
*
* 处理当前用户的任务activiti操作的表
* act_hi_actinst 已完成的活动信息
* act_hi_identitylink 参与者信息
* act_hi_procinst 流程实例
* act_hi_taskinst 任务实例
* act_ru_execution 执行表
* act_ru_identitylink 参与者信息
* act_ru_task 任务
*/
public class ActivitiTaskComplete {
	public static void main(String[] args) {
	// 1、获取ProcessEngine对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	// 2、获取TaskService资源
	TaskService taskService = processEngine.getTaskService();
	// 3、处理任务,结合当前用户任务列表的查询的任务ID2505
	taskService.complete("2505");
 	 }
}

以此类推,我们可以根据查询出来的任务ID完成完整的任务流程。另外,部署流程的时候有可能是zip压缩包格式的,这时采用以下方式:

java使用Activiti工作流 activiti工作流教程_java使用Activiti工作流_14

//压缩包方式实现流程的部署
public static void main(String[] args) {
	// 1、获取ProcessEngine对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	// 2、获取RepositoryService资源
	RepositoryService repositoryService = processEngine.getRepositoryService();
	// 3、转换出InputStream流对象
	InputStream inputStream = ActivitiLiuChengBuShu.class.getClassLoader()
	.getResourceAsStream("diagram/diagramBPMN.zip");
	// 4、将InputStream流转换成ZipInputStream流
	ZipInputStream zipInputStream = new ZipInputStream(inputStream);
	// 5、部署流程
	Deployment deployment = repositoryService.createDeployment()
	.addZipInputStream(zipInputStream)
	.name("请假流程")
	.deploy();
	System.out.println(deployment.getName());
	System.out.println(deployment.getId());
}

ProcessEngineConfiguration类,主要作用是加载activiti.cfg.xml配置文件
ProcessEngine类,只要作用是帮助我们可以快速得到各个Service接口,并且可以生成activiti工作环境。