TaskService 使用表达式调用spring bean 方法

来源:4-12 事件处理及监听器配置-eventLinstener-2

破地瓜

2019-11-21

如题 部分流程文件如下

<serviceTask id="service" name="服务" activiti:expression="${testService.print(name)}"></serviceTask>

问题描述:
serviceTask 调用 testServiceprint方法; 其中testServicespring的一个bean

流程图如下
图片描述

过程

  • 创建bean 并加载流程文件
@Bean
public ProcessEngine processEngine(){
   ProcessEngineConfiguration cfg =ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
   ProcessEngine processEngine = cfg.buildProcessEngine();
   DeploymentBuilder deployment = processEngine.getRepositoryService().createDeployment();
   deployment.addClasspathResource("test1.bpmn20.xml");
   Deployment deploy = deployment.deploy();
   return processEngine;
}
  • 启动项目
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}
  • 测试代码
@RestController
public class TestController {
    @Autowired
    private ProcessEngine processEngine;
    @Autowired
    private TestService testService;
    @GetMapping("/test")
    public void test(){
        RuntimeService runtimeService = processEngine.getRuntimeService();
        Map<String,Object> context=new HashMap<>();
        context.put("name","Lucy");
        //context.put("testService",testService);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("test", context);
        System.out.println(processInstance.getId());
    }
}

错误信息如下

org.activiti.engine.ActivitiException: Could not execute service task expression
Caused by: org.activiti.engine.ActivitiException: Unknown property used in expression: ${testService.print(name)}
Caused by: javax.el.PropertyNotFoundException: Cannot resolve identifier 'testService'

尝试方法:

  • testService放入流程的上下文
    若取消context.put("testService",testService); 的注释,报以下异常(不能序列化)
org.activiti.engine.ActivitiException: couldn't find a variable type that is able to serialize com.boco.mis.activiti.hello.TestService@216d848e

调整TestService的代码 实现Serializable,之后可以正常运行

@Service(value="testService")
public class TestService implements Serializable{
   public void print(String name){
       System.out.println("TestService1.print("+name+")");
   }
}

但是,正式环境中testService会依赖其他类,依赖类也必须实现Serializable,才可以,而依赖类又会依赖其他类,所以此方案不可行

后续又对activiti:classactiviti:delegateExpression 进行了测试 均没有达到预期效果

所有测试代码均在https://github.com/jiabiaoli/activiti-hello

写回答

1回答

Jimmy

2019-11-22

问题出在 这里 

ProcessEngineConfiguration cfg =ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
  ProcessEngine processEngine = cfg.buildProcessEngine(); 

在spring环境下通过这种方式创建的ProcessEngine并没有把spring 容器的bean放到流程引擎中

解决的方法

独立声明一下 SpringProcessEngineConfiguration 成为一个bean

参考

@Bean

public SpringProcessEngineConfiguration processEngineConfiguration(){

    //具体参数需要配置

    renturn new SpringProcessEngineConfiguration()

}

0
4
Jimmy
回复
破地瓜
???
2019-11-23
共4条回复

Activiti6.0工作流引擎深度解析 从容应对复杂业务变化

系统讲解工作流引擎 全方位提升技术能力 从容应对复杂业务变化

1031 学习 · 339 问题

查看课程