activiti 一个节点指定多个用户并发完成进入下一步

本文介绍了使用Activiti工作流引擎实现流程实例的创建、监听与管理。通过创建监听器类`Process2Listener`和`Process4Listener`,分别在任务创建和完成时进行日志输出。在测试类`MyTest2`中,展示了如何部署流程、启动流程实例、分配任务以及完成任务的过程。测试结果显示了流程的不同阶段和变量状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.流程图

step2的相关配置

 

 

 

2.监听类

package com.knife.testActivity;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class Process2Listener implements TaskListener {

	@Override
	public void notify(DelegateTask paramDelegateTask) {
		// TODO Auto-generated method stub
		System.out.println("############task create ... "+paramDelegateTask.getAssignee());
	}

	

}
package com.knife.testActivity;

import java.util.Map;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class Process4Listener implements TaskListener {

	@Override
	public void notify(DelegateTask paramDelegateTask) {
		// TODO Auto-generated method stub
		System.out.println("############task complete ... "+paramDelegateTask.getAssignee());
		
		Map<String,Object> map2 = paramDelegateTask.getVariables();
		for(String key:map2.keySet())
		System.out.println(key+" "+map2.get(key));
		
	}
}

3.

package com.knife.testActivity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTest2 {

	
	@Autowired
	ProcessEngine processEngine;
	
	public String createDeployment(String name,String resource) {
		Deployment deployment = processEngine.getRepositoryService()
				.createDeployment()
				.name(name)
				.addClasspathResource(resource).deploy();
		System.out.println("部署ID:" + deployment.getId());// 1
		System.out.println("部署时间:" + deployment.getDeploymentTime());
		
		ProcessDefinition process=processEngine.getRepositoryService() // 获取service
                .createProcessDefinitionQuery() // 创建流程定义查询
                .deploymentId(deployment.getId()).singleResult();
		
		System.out.println("流程定义ID:" + process.getId());// 1
		
		return process.getId();
	}
	
	public Task getTask(String pid,String user) {
		Task task = processEngine.getTaskService().createTaskQuery().processDefinitionId(pid).taskAssignee(user).singleResult();
		if(task!=null) {
			System.out.println(task.getId()+":"+task.getName() + ":" + task.getAssignee());
		}else {
			System.out.println(user+" 不存在");
		}	
		return task;
	}
	
	
	
	public String startProcessByPid(String pid,String user) {
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("user", user);
		ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById(pid,map);
		return processInstance.getId();
	}
	
	@Test
	public void test1() {
		
		String name = "myProcess2";
		String user = "boss";
		String pid = createDeployment(name, "process/MyProcess2.bpmn");
		System.out.println("############部署流程:"+pid);
		startProcessByPid(pid,user);
		System.out.println("############开启流程进入step1");
		Task step1 = getTask(pid,user);
		HashMap<String, Object> map = new HashMap<>();
		List<String> userlist = new ArrayList<String>();
		userlist.add("aaa");
		userlist.add("bbb");
		userlist.add("ccc");
		map.put("users", userlist);
		map.put("looptime", userlist.size());
		System.out.println("############指定多个用户 进入step2");
		processEngine.getTaskService().complete(step1.getId(), map);
		
		
		List<Task> tasklist = processEngine.getTaskService().createTaskQuery().processDefinitionId(pid).list();
		for(Task task:tasklist) {
			System.out.println(task.getId()+":"+task.getName() + ":" + task.getAssignee());
		}
		
		System.out.println("############每个用户单独提交");
		for(String user1:userlist) {
			Task step2 = getTask(pid,user1);
			if(step2!=null) {
				
				HashMap<String, Object> map1 = new HashMap<>();
				map1.put("condition", user1+" ok");
				processEngine.getTaskService().complete(step2.getId(), map1);
			}
		}
		
		
		System.out.println("############所有用户提交完成 进入step3");
		tasklist = processEngine.getTaskService().createTaskQuery().processDefinitionId(pid).list();
		for(Task task:tasklist) {
			System.out.println(task.getId()+":"+task.getName() + ":" + task.getAssignee());
			Map<String,Object> map2 = task.getProcessVariables();
			for(String key:map2.keySet())
			System.out.println(key+" "+map2.get(key));
		}
	}
	
}

4.测试结果

部署ID:c53b5305-518d-11eb-bc27-b0fc365d7a1f
部署时间:Fri Jan 08 16:44:50 CST 2021
流程定义ID:myProcess2:22:c56e22d7-518d-11eb-bc27-b0fc365d7a1f
############部署流程:myProcess2:22:c56e22d7-518d-11eb-bc27-b0fc365d7a1f
############开启流程进入step1
c580725b-518d-11eb-bc27-b0fc365d7a1f:step1:boss
############指定多个用户 进入step2
############task create ... aaa
############task create ... bbb
############task create ... ccc
c59496ac-518d-11eb-bc27-b0fc365d7a1f:step2:aaa
c595810e-518d-11eb-bc27-b0fc365d7a1f:step2:bbb
c5958110-518d-11eb-bc27-b0fc365d7a1f:step2:ccc
############每个用户单独提交
c59496ac-518d-11eb-bc27-b0fc365d7a1f:step2:aaa
############task complete ... aaa
condition aaa ok
nrOfActiveInstances 3
loopCounter 0
looptime 3
user aaa
users [aaa, bbb, ccc]
nrOfCompletedInstances 0
nrOfInstances 3
c595810e-518d-11eb-bc27-b0fc365d7a1f:step2:bbb
############task complete ... bbb
condition bbb ok
nrOfActiveInstances 2
loopCounter 1
looptime 3
user bbb
users [aaa, bbb, ccc]
nrOfCompletedInstances 1
nrOfInstances 3
c5958110-518d-11eb-bc27-b0fc365d7a1f:step2:ccc
############task complete ... ccc
condition ccc ok
nrOfActiveInstances 1
loopCounter 2
looptime 3
user ccc
users [aaa, bbb, ccc]
nrOfCompletedInstances 2
nrOfInstances 3
############所有用户提交完成 进入step3
c5d19fb3-518d-11eb-bc27-b0fc365d7a1f:step3:null

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值