Activit(二)——实例

一、安装

  至于Activiti的安装,这里不多少了,推荐篇文章,可以参考一下。

二、实例

 上篇博客说了,Activiti的整个流程,我们按着这个流程进行就可以了:

  1、通过activiti.cfg.xml来拿到数据库连接的信息,创建一个默认的流程引擎
  2、流程引擎获取getRepositoryService,然后创建createDeployment然后加载bpmn文件和png图片,部署一个流程
  3、部署好流程之后,通过流程引擎获取getRuntimeService,然后启动流程实例
  4、如果需要其他的服务,通过流程引擎获取对应的服务接口,调用对应的接口方法即可!


 整体结构:




 流程文件leavel.bpmn



 具体代码:

  1、通过activiti.cfg.xml来拿到数据库连接的信息,创建一个默认的流程引擎


    ProcessEngine pe=ProcessEngines.getDefaultProcessEngine();


  这段代码,会默认加载src下的名称为activiti.cfg.xml的配置文件,可以看其源码:


 public synchronized static void init() {
    if (!isInitialized) {
      if(processEngines == null) {
        // Create new map to store process-engines if current map is null
        processEngines = new HashMap<String, ProcessEngine>();        
      }
      ClassLoader classLoader = ReflectUtil.getClassLoader();
      Enumeration<URL> resources = null;
      try {
       <span style="color:#ff0000;"> resources = classLoader.getResources("activiti.cfg.xml");</span>
      } catch (IOException e) {
        throw new ActivitiIllegalArgumentException("problem retrieving activiti.cfg.xml resources on the classpath: "+System.getProperty("java.class.path"), e);
      }
      
      // Remove duplicated configuration URL's using set. Some classloaders may return identical URL's twice, causing duplicate startups
      Set<URL> configUrls = new HashSet<URL>();
      while (resources.hasMoreElements()) {
        configUrls.add( resources.nextElement() );
      }
      for (Iterator<URL> iterator = configUrls.iterator(); iterator.hasNext();) {
        URL resource = iterator.next();
        log.info("Initializing process engine using configuration '{}'",  resource.toString());
        initProcessEnginFromResource(resource);
      }
      
      try {
        resources = classLoader.getResources("activiti-context.xml");
      } catch (IOException e) {
        throw new ActivitiIllegalArgumentException("problem retrieving activiti-context.xml resources on the classpath: "+System.getProperty("java.class.path"), e);
      }
      while (resources.hasMoreElements()) {
        URL resource = resources.nextElement();
        log.info("Initializing process engine using Spring configuration '{}'",  resource.toString());
        initProcessEngineFromSpringResource(resource);
      }

      isInitialized = true;
    } else {
      log.info("Process engines already initialized");
    }
  }



  2、流程引擎获取getRepositoryService,然后创建createDeployment然后加载bpmn文件和png图片,部署一个流程


	//部署一个流程
	@Test 
	public void test01(){
		
		Deployment deploment=pe.getRepositoryService().createDeployment()
								.addClasspathResource("diagrams/leavel.bpmn")
								.addClasspathResource("diagrams/leavel.png")
								.name("请假完整实例")
								.deploy();
		
		System.out.println(deploment.getId()+"---"+deploment.getName());
	}

  3、部署好流程之后,通过流程引擎获取getRuntimeService,然后启动流程实例


	//通过流程引擎启动一个流程实例
	@Test
	public void test02(){
		ProcessInstance pi=pe.getRuntimeService().startProcessInstanceByKey("Leavel");
		System.out.println(pi.getId()+"---"+pi.getProcessInstanceId());
	}

  4、如果需要其他的服务,通过流程引擎获取对应的服务接口,调用对应的接口方法即可!

  查询任务:


	//查询任务
	@Test
	public void test03(){
		
		//查询任务
		List<Task> tasks=pe.getTaskService().createTaskQuery().taskAssignee("leilei").list();
		if(tasks!=null && tasks.size()>0){
			for (Task task : tasks) {
				System.out.println("执行人:  "+task.getAssignee()+"---任务Id:  "+task.getId()+"---任务名称"+task.getName());
			}
		}
		
		//获取运行时的流程实例信息
		List<ProcessInstance> processInstances=pe.getRuntimeService().createProcessInstanceQuery().list();
		if(processInstances!=null&&processInstances.size()>0){
			for (ProcessInstance processInstance : processInstances) {
				System.out.println(processInstance.getId()+""+processInstance.getProcessInstanceId());
			}
		}
		
		
		List<ProcessDefinition> processDefinitions=pe.getRepositoryService().createProcessDefinitionQuery().list();
		if(processDefinitions!=null&&processDefinitions.size()>0)
			{for (ProcessDefinition processDefinition : processDefinitions) {
				System.out.println(processDefinition.getCategory()+"  流程部署的ID"+processDefinition.getDeploymentId()+"  部署流程的key "+processDefinition.getKey()+"  资源名称:"+processDefinition.getResourceName()+"   版本:"+processDefinition.getVersion());
			}
		}
	}

  5、完成个人任务


<span style="font-size:18px;">	//办理任务,上一个任务完成,流程会自动转移到下一个
	@Test
	public void testCompelete(){
		pe.getTaskService().complete("204");
		List<Task> tasks=pe.getTaskService().createTaskQuery().taskAssignee("xiaoqiang").list();
		if(tasks!=null&&tasks.size()>0){
			for (Task task : tasks) {
				System.out.println("任务执行人"+task.getAssignee()+"---流程实例ID"+task.getProcessInstanceId()+"---流程定义ID"+task.getProcessDefinitionId());
			}
		}
	}</span>


三、小结

    通过实例可以看出,activiti的核心是通过流程引擎processEngine获取对应的服务,进行部署流程,启动流程,任务节点操作任务,每个节点完成任务之后,任务流程结束,并将其中涉及到的数据‘自动化’持久化到数据中去!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Activiti 是一个开源的工作流引擎,支持并行多实例节点加签功能。在流程定义中,可以通过添加多实例属性来定义一个节点为并行多实例节点。并行多实例节点可以将一个任务同时分配给多个参与者处理。 要将一个节点定义为并行多实例节点,可以在节点的XML中添加以下属性: ``` <userTask id="task1" name="Task 1" activiti:assignee="${assignee}" activiti:multiInstanceLoopCharacteristics="_activiti_parallel"> ... </userTask> ``` 其中,`activiti:assignee` 属性用于指定任务的执行人,可以使用表达式来动态指定。`activiti:multiInstanceLoopCharacteristics` 属性用于指定并行多实例的循环特性。 在节点定义中,可以添加多实例的属性和子元素来定义循环的次数和条件,比如: ``` <activiti:multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${users}" activiti:elementVariable="user"> <activiti:loopCardinality>${nrOfCandidates}</activiti:loopCardinality> ... </activiti:multiInstanceLoopCharacteristics> ``` 其中,`isSequential` 属性用于指定循环需要按顺序执行还是并行执行。`activiti:collection` 属性用于指定循环的集合,可以是一个变量或表达式。`activiti:elementVariable` 属性用于指定循环中的变量名。`activiti:loopCardinality` 属性用于指定循环的次数。 通过加签功能,可以将任务同时分配给多个参与者处理,提高处理效率。每个参与者可以独立处理任务,并在处理完成后将结果反馈给流程引擎。流程引擎会根据加签节点的配置,汇总参与者的处理结果,并决定流程的后续走向。 总而言之,Activiti 的并行多实例节点加签功能可以帮助流程引擎实现任务的并行处理,提高工作效率和流程的灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值