BPMN2.0服务任务

1. 服务任务(Java Service Task)

服务任务图形元素:

2. 服务任务(Java Service Task)执行Java程序的方法

  • 执行实现JavaDelegate或ActivitiBehavior的类

  • 执行一个JavaDelegate对象表达式,通常是spring配置的bean

  • 执行调用方法表达式和值表达式

3. 执行实现JavaDelegate或ActivitiBehavior的类

两者区别:JavaDelegate为直接执行,ActivitiBehavior为流程等待

代码实现(代理类):

public class MyJavaDelegate implements JavaDelegate, Serializable {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyJavaDelegate.class);
    
    @Override
    public void execute(DelegateExecution execution) {
           LOGGER.info("run my java delegate {}", this);
    }
}

流程定义文件:

<process id="my-process">

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

<serviceTask id="someTask" name="Service Task"
activiti:class="com.syc.activiti.example.MyActivitiBehavior"/>
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" />

<endEvent id="end" />

</process>

测试文件:

@Test
@Deployment(resources = "my-process-servicetask1.bpmn20.xml")
public void testServiceTask(){
    ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");

    List<HistoricActivityInstance> activityInstances = activitiRule.getHistoryService().createHistoricActivityInstanceQuery().orderByHistoricActivityInstanceEndTime().asc().list();

    for(HistoricActivityInstance activityInstance : activityInstances){
        LOGGER.info("activity = {}", activityInstance);
    }
}

测试输出效果:

同理,MyActivitiBehavior的测试类:

@Test
@Deployment(resources = "my-process-servicetask2.bpmn20.xml")
public void testUserTask2(){
    ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");

    List<HistoricActivityInstance> activityInstances = activitiRule.getHistoryService().createHistoricActivityInstanceQuery().orderByHistoricActivityInstanceEndTime().asc().list();

    for(HistoricActivityInstance activityInstance : activityInstances){
        LOGGER.info("activity = {}", activityInstance);
    }
    Execution execution = activitiRule.getRuntimeService().createExecutionQuery().activityId("someTask").singleResult();
    LOGGER.info("execution = {}", execution);

    //节点继续向后执行
    ManagementService managementService = activitiRule.getManagementService();
    managementService.executeCommand(new Command<Object>() {
        @Override
        public Object execute(CommandContext commandContext) {
        ActivitiEngineAgenda agenda = commandContext.getAgenda();
        agenda.planTakeOutgoingSequenceFlowsOperation((ExecutionEntity) execution,false);
        return null;
    }
});

    activityInstances = activitiRule.getHistoryService().createHistoricActivityInstanceQuery()
.orderByHistoricActivityInstanceEndTime().asc().list();

    for(HistoricActivityInstance activityInstance : activityInstances){
        LOGGER.info("activity = {}", activityInstance);
    }
}

4. JavaDelegate注入属性

//添加属性:姓名和描述
private Expression name;
private Expression desc;

@Override
public void execute(DelegateExecution execution) {
    if(name != null){
        Object value = name.getValue(execution);
        LOGGER.info("name = {}", value);
    }
    if(desc != null){
        Object value = desc.getValue(execution);
        LOGGER.info("desc = {}", value);
    }
    LOGGER.info("run my java delegate {}", this);
}

流程定义文件代码ServiceTask部分代码

<serviceTask id="someTask" name="Service Task"
activiti:class="com.syc.activiti.example.MyJavaDelegate">
<extensionElements>
    <activiti:field name="name" stringValue="The Java Delegate"/>
    <activiti:field name="desc">
        <activiti:expression>my ${desc}</activiti:expression>
    </activiti:field>
</extensionElements>
</serviceTask>

测试部分代码:

@Test
@Deployment(resources = "my-process-servicetask3.bpmn20.xml")
public void testServiceTask3(){
    Map<String, Object> variable = Maps.newHashMap();
    variable.put("desc", "the test java delegate");
    ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process",variable);

}

测试效果输出:

5. 执行一个JavaDelegate对象表达式

<serviceTask id="servicetask" name="Service Task"
   activiti:delegateExpression="${myJavaDelegate}"/>

<serviceTask id = "servicetask" name="Service Task"
    activiti:class="com.syc.activiti.example.MyJavaDelegate"/>

 使用DelegateExpression与使用Activiti:class的区别:

6. 执行调用方法表达式和值表达式

(1)编写JavaBean类,该类实现序列化方法

public class MyJavaBean implements Serializable {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyJavaBean.class);
    private String name;

    public String getName() {
        LOGGER.info("run getname name:{}",name);
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public MyJavaBean() {

    }

    public void sayHello(){
        LOGGER.info("run sayhello");
    }
}
原创文章 97 获赞 43 访问量 1万+

猜你喜欢

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