BPMN2.0脚本任务

1. 脚本任务

  • JUEL脚本(默认)(Java Unified Expression Lanaguage Java统一表达语言)

  • Groovy脚本(依赖groovy-all.jar)

  • JavaScript脚本

<scriptTask id="scripttask" name="Script Task">
     <script>${bean.invoke()}</script>
</scriptTask>

2. 脚本任务(Script Task)内置变量

添加依赖:

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
</dependency>

内置变量 execution, xxxService, processEngineConfiguration

保留关键字,不能用作变量使用:out, out:print, lang:Import, context, elcontext

3. 脚本任务(Script Task)设置返回值

JUEL:

JavaScript:

(1)使用groovy脚本

测试代码

my-process-scripttask1.bpmn20.xml中部分代码:

<process id="my-process">

<startEvent id="start" />
<sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" />

<scriptTask id="someTask" name="Script Task"
scriptFormat="groovy">
    <script>
        def myValue = "value123"
        execution.setVariable("myKey", myValue)
    </script>
</scriptTask>
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" />

<endEvent id="end" />
</process>

测试代码:

public class ScriptTaskTest {
private static final Logger LOGGER = LoggerFactory.getLogger(ScriptTaskTest.class);

@Rule
public ActivitiRule activitiRule = new ActivitiRule();

@Test
@Deployment(resources = {"my-process-scripttask1.bpmn20.xml"})
public void testUserTask(){
    ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");
    HistoryService historyService = activitiRule.getHistoryService();
    List<HistoricVariableInstance> historicVariableInstances = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstance.getId()).orderByVariableName().asc().listPage(0, 100);
    for(HistoricVariableInstance historicVariableInstance : historicVariableInstances){
        LOGGER.info("variable = {}", historicVariableInstance);
    }
    LOGGER.info("variables.size = {}", historicVariableInstances.size());

    }
}

测试输出:

(2)使用JUEL脚本(设置返回值):

<process id="my-process">

<startEvent id="start" />
<sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" />

<scriptTask id="someTask" name="Script Task" scriptFormat="juel" activiti:resultVariable="mySum">
    <script>
        #{key1 + key2}
    </script>
</scriptTask>
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" />

<endEvent id="end" />
</process>

测试代码:

@Test
@Deployment(resources = {"my-process-scripttask2.bpmn20.xml"})
public void testScriptTask2(){
    Map<String, Object> variables = Maps.newHashMap();
    variables.put("key1", 3);
    variables.put("key2", 5);

    ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process", variables);
    HistoryService historyService = activitiRule.getHistoryService();
    List<HistoricVariableInstance> historicVariableInstances = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstance.getId()).orderByVariableName().asc().listPage(0, 100);
    for(HistoricVariableInstance historicVariableInstance : historicVariableInstances){
    LOGGER.info("variable = {}", historicVariableInstance);
    }
    LOGGER.info("variables.size = {}", historicVariableInstances.size());

}

测试输出:

(3)使用JavaScript脚本

只需要将(2)中流程定义文件中的脚本类型改为javascript,脚本内容改为key1 + key2

<scriptTask id="someTask" name="Script Task"
scriptFormat="javascript" activiti:resultVariable="mySum">
    <script>
        key1 + key2
    </script>
</scriptTask>

测试输出:

可以用脚本实现的就定义在脚本定义文件里面,避免修改java代码。

原创文章 97 获赞 43 访问量 1万+

猜你喜欢

转载自blog.csdn.net/shao_yc/article/details/105341698