专业的JAVA编程教程与资源

网站首页 > java教程 正文

SpringBoot集成工作流引擎(springboot集成zuul)

temp10 2024-10-27 14:42:23 java教程 10 ℃ 0 评论

一、Activiti简介

Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.

二、Activiti插件安装

关于activiti建议在eclipse下安装相关插件,idea下安装的actiBPMN有很多问题,界面也不是很友好。

SpringBoot集成工作流引擎(springboot集成zuul)

下图是eclipse下绘制的一个流程图:


一个简单的工作流包括开始节点,流程节点和结束节点。

三、SpringBoot集成Activiti

这里我们用的是activiti6.0版本,主要需要如下包:

<dependency>
 <groupId>org.activiti</groupId>
 <artifactId>activiti-spring-boot-starter-basic</artifactId>
 <version>6.0.0</version>
</dependency>
<!--mysql驱动-->
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.29</version>
</dependency>

application.yml主要配置如下:

server:
 port: 8801
spring:
 datasource:
 url: jdbc:mysql://10.168.xx.xx:8106/uaf_activiti?Unicode=true&characterEncoding=UTF-8
 username: root
 password: xxxxx
 activiti:
 database-schema-update: true
 check-process-definitions: false

以上为基本配置,完成上述配置后我们启动activiti服务系统会自动初始表到我们mysql库。

四、监听方式配置Activiti流程

我们一般配置activiti流程的时候代理人都是写死的方式,这样若修改代理人时需要重新部署流程。

activiti也支持灵活的方式配置代理人,主要有两种方式:

  1. 动态参数方式。
  2. 监听方式。

这里我们介绍监听方式,配置监听方式首先我们需要定义activiti的监听类:

public class ActProcessListener implements TaskListener {

	/**流程监听成员变量*/
	private FixedValue processCode;

	@Override
	public void notify(DelegateTask delegateTask) {
		//TODO 新建流程节点与审批用户/角色关联表,实现流程动态监听
		String process = String.valueOf(processCode.getValue(delegateTask));
		MySlf4j.textInfo("进入{0}流程节点监听.....", process);
		if ("leaveApply".equals(process)) {
			delegateTask.addCandidateUser("will");
		} else if ("deptManagerAppr".equals(process)) {
			delegateTask.addCandidateUser("deman");
		} else if ("hrClerkAppr".equals(process)) {
			delegateTask.addCandidateUser("petty");
		} else if ("hrManagerAppr".equals(process)) {
			delegateTask.addCandidateUser("may");
		}

	}
}

通过监听方式,流程可以自动判断下一节点的受理人,我们也可以将监听配置放到数据库管理,实现真正意义上的动态配置。

工作流需要管理相应的监听类,并指定监听成员变量。如下图:


五、工作流引擎执行

工作流程引擎一般包括如下步骤:


相关接口代码如下:

/**部署流程*/
ActProcessRespVo deployProcess(ActProcessReqVo actProcessReqVo);

/**启动流程*/
ActWorkflowRespVo startWorkflow(ActWorkflowReqVo<LabelInfo> actWorkflowReqVo);

/**签收任务*/
boolean claimTask(ActClaimTaskReqVo actClaimTaskReqVo);

/**提交任务*/
boolean completeTask(ActCompleteTaskReqVo<LabelInfo> actCompleteTaskReqVo);

/**查询任务是否已签收*/
boolean checkClaimTask(ActClaimTaskReqVo actClaimTaskReqVo);

/**释放任务*/
boolean releaseTask(String taskId);

/**查询待办任务*/
ActProcessTaskRespVo queryTodoTasks(ActProcessTaskReqVo actProcessTaskReqVo);

测试类代码如下:

@SpringBootTest(classes = ActivitiApplication.class)
@RunWith(SpringRunner.class)
public class ActivitiProcessTest {

	@Autowired
	private IActivitiService activitiService;
	@Autowired
	private IWorkflowService workflowService;

	/**流程文件路径*/
	static String filePath = System.getProperty("user.dir") + "/src/main/resources/processes/leaveProcess.bpmn";

	/**流程部署*/
	@Test
	public void testDeployProcess() throws IOException {
		byte[] b = Files.readAllBytes(Paths.get(filePath));
		ActProcessReqVo actProcessReqVo = new ActProcessReqVo();
		actProcessReqVo.setProcessId("leaveProcess");
		actProcessReqVo.setProcessName("请假流程");
		actProcessReqVo.setProcessFileType("bpmn");
		actProcessReqVo.setProcessBase64Str(Base64Utils.encode(b));
		activitiService.deployProcess(actProcessReqVo);
	}

	/**启动流程*/
	@Test
	public void testStartWorkflow() {
		ActWorkflowReqVo<LabelInfo> actWorkflowReqVo = new ActWorkflowReqVo<>();
		actWorkflowReqVo.setBusinessId("201912020001");
		actWorkflowReqVo.setProcessId("leaveProcess");

		List<LabelInfo> labelInfos = new ArrayList<>();
		LabelInfo labelInfo1 = new LabelInfo();
		labelInfo1.setLabName("userName");
		labelInfo1.setLabType("S");
		labelInfo1.setLabValue("will");
		labelInfos.add(labelInfo1);
		actWorkflowReqVo.setLabels(labelInfos);

		ActWorkflowRespVo actWorkflowRespVo = workflowService.startWorkflow(actWorkflowReqVo);
		MySlf4j.textInfo("启动流程输出:{0}", JsonUtils.toJson(actWorkflowRespVo));
	}

	/** 提交任务-请假申请*/
	@Test
	public void testCompleteTask1() {
		ActCompleteTaskReqVo actCompleteTaskReqVo = new ActCompleteTaskReqVo();
		actCompleteTaskReqVo.setComment("个人事务请假1天.....");
		actCompleteTaskReqVo.setProcessInstanceId("5001");
		actCompleteTaskReqVo.setUserId("will");
		actCompleteTaskReqVo.setProcessId("leaveProcess");
		boolean res = workflowService.completeTask(actCompleteTaskReqVo);
		MySlf4j.textInfo("签收任务流程输出:{0}", res);
	}

	/** 提交任务-部门主管审批*/
	@Test
	public void testCompleteTask2() {
		ActCompleteTaskReqVo<LabelInfo> actCompleteTaskReqVo = new ActCompleteTaskReqVo<>();
		actCompleteTaskReqVo.setComment("同意");
		actCompleteTaskReqVo.setProcessInstanceId("2501");
		actCompleteTaskReqVo.setUserId("deman");
		actCompleteTaskReqVo.setProcessId("leaveProcess");

		List<LabelInfo> labelInfos = new ArrayList<>();
		LabelInfo labelInfo1 = new LabelInfo();
		labelInfo1.setLabName("opinion");
		labelInfo1.setLabType("S");
		labelInfo1.setLabValue("TH");

		LabelInfo labelInfo2 = new LabelInfo();
		labelInfo2.setLabName("days");
		labelInfo2.setLabType("I");
		labelInfo2.setLabValue("1");

		labelInfos.add(labelInfo1);
		labelInfos.add(labelInfo2);
		actCompleteTaskReqVo.setLabels(labelInfos);

		boolean res = workflowService.completeTask(actCompleteTaskReqVo);
		MySlf4j.textInfo("签收任务流程输出:{0}", res);
	}

	/** 提交任务-HR审批*/
	@Test
	public void testCompleteTask3() {
		ActCompleteTaskReqVo actCompleteTaskReqVo = new ActCompleteTaskReqVo();
		actCompleteTaskReqVo.setComment("同意");
		actCompleteTaskReqVo.setProcessInstanceId("2501");
		actCompleteTaskReqVo.setUserId("petty");
		actCompleteTaskReqVo.setProcessId("leaveProcess");

		List<LabelInfo> labelInfos = new ArrayList<>();
		LabelInfo labelInfo1 = new LabelInfo();
		labelInfo1.setLabName("opinion");
		labelInfo1.setLabType("S");
		labelInfo1.setLabValue("TH");

		labelInfos.add(labelInfo1);
		actCompleteTaskReqVo.setLabels(labelInfos);

		boolean res = workflowService.completeTask(actCompleteTaskReqVo);
		MySlf4j.textInfo("签收任务流程输出:{0}", res);
	}

	/** 查看任务是否签收*/
	@Test
	public void testCheckClaimTask() {
		ActClaimTaskReqVo actClaimTaskReqVo = new ActClaimTaskReqVo();
		actClaimTaskReqVo.setUserId("will");
		actClaimTaskReqVo.setTaskId("2507");
		boolean res = workflowService.checkClaimTask(actClaimTaskReqVo);
		MySlf4j.textInfo("查看任务是否签收输出:{0}", res);
	}

	/** 查看待办任务*/
	@Test
	public void testQueryTodoTasks() {
		ActProcessTaskReqVo actProcessTaskReqVo = new ActProcessTaskReqVo();
		actProcessTaskReqVo.setProcessId("leaveProcess");
		actProcessTaskReqVo.setUserId("will");
		actProcessTaskReqVo.setStartNum(0);
		actProcessTaskReqVo.setRecNum(10);
		ActProcessTaskRespVo actProcessTaskRespVo = workflowService.queryTodoTasks(actProcessTaskReqVo);
		MySlf4j.textInfo("查询待办任务输出:{0}", JsonUtils.toJson(actProcessTaskRespVo));
	}

需要完整的代码可以私信!!!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表