服务任务不同于用户任务(需人工处理),服务任务一般是一段可自动执行的任务而无需人工干预。

例如:当用户完成"任务1"后,想自动执行一个跑批任务处理后台数据库表的数据,那么只需要在"任务1"节点后放置一个ServiceTask(需要指定该服务任务所要执行的java类或spring容器的bean) ,当服务任务执行完成后,再继续执行任务2 。

服务任务的配置

例1:
<serviceTask id="servicetask1" name="服务任务" activiti:delegateExpression="${myServiceTask}"></serviceTask>

使用委托表达式,UEL表达式中myServiceTask必须是流程引擎(流程变量)或spring容器中的bean的名称,且这个bean必须实现 JavaDelegate接口(实现其中execute方法)

 

@Component("myServiceTask")
public class MyServiceTask implements Serializable,JavaDelegate {


    private static final long serialVersionUID = 1L;

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        System.out.println("MyServiceTask开始执行, 自动任务:自动执行一些用户自定义的逻辑");

        String id = execution.getId();
        String processInstanceId = execution.getProcessInstanceId();
        String businessKey = execution.getProcessBusinessKey();
        String currentActivityName = execution.getCurrentActivityName();
        String processDefinitionId = execution.getProcessDefinitionId();

        String key1 =execution.getVariable("key1",String.class);
        System.out.println("key1:"+key1);

        System.out.println("执行实例id:"+id);
        System.out.println("流程实例id:"+processInstanceId);
        System.out.println("流程实例businessKey:"+businessKey);
        System.out.println("当前活动名称:"+currentActivityName);
        System.out.println("流程定义id:"+processDefinitionId);


    }
}

例2:
<serviceTask id="servicetask1" name="服务任务" activiti:expression="${myBean.hello(hname)}"></serviceTask>

使用expression表达式,myBean必须是流程引擎容器(流程变量)或spring容器中的bean,hello是该bean的一个方法,且该方法需传一个参数,参数hname是流程实例中的一个流程变量。注:流程变量可在UEL表达式中获取到,execution是当前实例对象也可以在UEL表达式中获取到。

我们可以发现:这里使用expression 比delegateExpression可以更加灵活,因为执行的方法可自行编写而不是总是需要实现execute方法,且方法的的参数也可以动态地从流程变量中获取,或者也可以直接传入字面量参数(例如数字和字符串)

@Component("myBean")
public class MyBean {

    public void hello(String hname){
        System.out.println("===myBean执行====");
        System.out.println("你好:"+hname);//打印   你好:中国
    }

}

spring测试类

@Test
    public  void completeTask1(){
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("myProcess");

        Task task = taskService.createTaskQuery()
                .processInstanceId(pi.getProcessInstanceId()).singleResult();

        Map<String,Object> vars =new HashMap<>();
        vars.put("key1","aaa");
        vars.put("key2","bbb");
        vars.put("hname","中国");
        String taskId =task.getId();
        taskService.complete(taskId,vars);
    }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐