Activiti-2-Hello-world

Activiti-2-Hello-world

Posted by fox on January 11, 2016

Activiti-2-Hello-world


快速开始一个helloworld

在activiti中 有4钟方法来声明java调用逻辑:

  • 实现JavaDelegate或ActivityBehavior
  • 执行解析代理对象的表达式
  • 调用一个方法表达式
  • 调用一直值表达式

在包com.demo.jclass下新建javaclass: TestDelClass ,实现JavaDelegate,ide会提示你实现方法

package com.demo.jclass;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;


public class TestDelClass implements JavaDelegate {
    public void execute(DelegateExecution execution) throws Exception {
        System.out.println("Hi activiti! ");
    }
}

或许有人会问JavaDelegate或ActivityBehavior有什么区别,区别就是JavaDelegate提供的功能没有ActivityBehavior的复杂和强大。 实现ActivityBehavior的类可以影响流程的走向,如果不是非常复杂,就用JavaDelegate就够了

接下来是工作流的定义文件,由于是一开始,我们就用最简单的方式来写,用activiti:class指定类就可以,activiti:delegateExpression,activiti:expression这样的语法适用于指定spring的bean.

classpath下新建流程文件 java_class_demo.bpmn20.xml,指定刚才创建的类到serviceTask上面,代码如下

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions id="definitions"
             targetNamespace="http://activiti.org/bpmn20"
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:activiti="http://activiti.org/bpmn">

    <process id="java_class_demo">
        <startEvent id="demoStart" name="start"/>
        <sequenceFlow sourceRef="demoStart" targetRef="javaSeviceTask"/>
        <serviceTask id="javaSeviceTask" name="sayHello" activiti:class="com.demo.jclass.TestDelClass"/>

        <sequenceFlow id="flow" sourceRef="javaSeviceTask" targetRef="end"/>
        <endEvent id="end" name="End"/>
    </process>
</definitions>

然后随便建立另一个类,按照创建引擎->部署流程->启动指定工作流的顺序来写,代码如下

package com.demo.process;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.ProcessDefinition;

public class SimpleProcessDemo {


    public static void main(String[] args) {
        ProcessEngine processEngine =  ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration().buildProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        repositoryService.createDeployment().addClasspathResource("workflow/java_class_demo.bpmn20.xml").deploy();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
        System.out.println(processDefinition.getKey());

        RuntimeService runtimeService = processEngine.getRuntimeService();
        runtimeService.startProcessInstanceByKey("java_class_demo");
    }
}

若一切顺利,你会看到这样的输出:

java_class_demo
hello , i'm from TestClass

Process finished with exit code 0

使用流程中的变量

activit工作流task之间自始至终携带着一个map的变量集合,可以在流程一开始的时候便设置一些值进去,在过程中也可以添加删除或者改变。

我们来设计一个简单的携带变量的流程,在流程开始时,向javaSeviceTask1写入一些变量,然后在里面打印出来,在javaSeviceTask1流向javaSeviceTask2之前,再写入一些变量,在javaSeviceTask2中打印从javaSeviceTask1中获取的变量

修改或者新建classpath下的java_class_demo.bpmn20.xml,代码如下


<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions id="definitions"
             targetNamespace="http://activiti.org/bpmn20"
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:activiti="http://activiti.org/bpmn">

    <process id="java_class_demo">
        <startEvent id="demoStart" name="start"/>
        <sequenceFlow sourceRef="demoStart" targetRef="javaSeviceTask1"/>
        <serviceTask id="javaSeviceTask1" name="useVar1" activiti:class="com.demo.jclass.UseVarClsA"/>
        <sequenceFlow id="flow1" sourceRef="javaSeviceTask1" targetRef="javaServiceTask2"/>
        <serviceTask id="javaServiceTask2" name="useVar2" activiti:class="com.demo.jclass.UseVarClsB"/>
        <sequenceFlow sourceRef="javaServiceTask2" targetRef="end"/>
        <endEvent id="end" name="End"/>
    </process>
</definitions>

修改SimpleProcessDemo类的代码,写入一些变量,启动流程的时候附带进流程中,如下

package com.demo.process;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.ProcessDefinition;

import java.util.HashMap;
import java.util.Map;

public class SimpleProcessDemo {


    public static void main(String[] args) {
        ProcessEngine processEngine =  ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration().buildProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        repositoryService.createDeployment().addClasspathResource("workflow/java_class_demo.bpmn20.xml").deploy();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
        System.out.println(processDefinition.getKey());

        RuntimeService runtimeService = processEngine.getRuntimeService();
        Map<String,Object> paras = new HashMap<String, Object>();
        paras.put("Jack","15");
        paras.put("Tom","16");
        runtimeService.startProcessInstanceByKey("java_class_demo", paras);
    }
}

然后com.demo.jclass包下新建class, UseVarClsA,在其中打印一开始设置进来的值,然后写进去一个随机值,key是”someVarFromUseVarClsA”,如下

package com.demo.jclass;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;

import java.util.Map;
import java.util.Random;

public class UseVarClsA implements JavaDelegate {
    public void execute(DelegateExecution execution) throws Exception {
        Map<String,Object> paras = execution.getVariables();
        for (Map.Entry<String, Object> stringObjectEntry : paras.entrySet()) {
            System.out.println(stringObjectEntry.getKey() + ":"+ stringObjectEntry.getValue());
        }
        execution.setVariable("someVarFromUseVarClsA",new Random().nextInt());

    }
}

然后com.demo.jclass包下新建class, UseVarClsB,打印从上一个节点带过来的值:即”someVarFromUseVarClsA”,代码如下

package com.demo.jclass;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;

public class UseVarClsB implements JavaDelegate {
    public void execute(DelegateExecution execution) throws Exception {
        Integer fromA = Integer.parseInt(execution.getVariable("someVarFromUseVarClsA").toString());
        System.out.println("I get var from A :" + fromA);
    }
}

一切顺利的话,控制台打印将会是下面的话

java_class_demo
Jack:15
Tom:16
I get var from A :-275413182