找回密码
 立即注册
首页 业界区 业界 flowable任务监听器和java-service依赖注入问题 ...

flowable任务监听器和java-service依赖注入问题

恃液 5 天前
前言

1. Flowable中Java服务任务的依赖注入方法,比如使用Spring的@Autowired或构造函数注入,并确保服务任务类由Spring管理。
2. 流程引擎配置中启用依赖注入和表达式解析的相关设置。
3. 异步任务执行器的配置,确保其与Spring上下文集成,处理依赖注入的Bean。
4. 常见问题排查,如检查Bean的作用域、是否正确使用delegateExpression等。
5. 可能的示例代码或配置片段,帮助用户理解如何正确配置。
另外,可能需要提醒用户注意流程定义文件中的服务任务配置是否正确,比如是否使用了expression或delegateExpression来引用Spring Bean,或者是否直接指定了Java类导致Spring的依赖注入不生效。
最后,如果有必要,可以比较一下在非Spring环境下如何手动处理依赖注入,但大部分情况下用户可能在使用Spring,所以重点放在Spring集成方面。
一、Java服务任务依赖注入

场景:在实现JavaDelegate的类中注入Spring管理的Bean(如Service、Repository)。
正确配置方法:


  • 步骤1:将服务类注册为Spring Bean
  1. @Component("myServiceTask") // 使用名称便于流程中引用
  2. public class MyServiceTask implements JavaDelegate {
  3.    
  4.     private final MyService myService;
  5.     @Autowired // 构造器注入推荐
  6.     public MyServiceTask(MyService myService) {
  7.         this.myService = myService;
  8.     }
  9.     @Override
  10.     public void execute(DelegateExecution execution) {
  11.         myService.businessMethod();
  12.     }
  13. }
复制代码

  • 步骤2:在流程定义中引用Bean
    使用delegateExpression指向Spring Bean的名称:
  1. [/code][size=3][b]常见问题解决:[/b][/size]
  2. [list]
  3. [*][b]Bean注入为null[/b]:
  4. [list]
  5. [*]确保类被Spring扫描(位于@ComponentScan路径下)。
  6. [*]检查流程定义中是否错误使用class属性而非delegateExpression。
  7. [*]确认流程引擎配置启用了Spring集成。
  8. [/list]
  9. [*][b]表达式解析失败[/b]:
  10. 在FlowableConfig中启用表达式解析和Spring注入:
  11. [/list][code]@Bean
  12. public SpringProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager) {
  13.     SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration();
  14.     config.setDataSource(dataSource);
  15.     config.setTransactionManager(transactionManager);
  16.     config.setDatabaseSchemaUpdate(Flowable.DB_SCHEMA_UPDATE_TRUE);
  17.     config.setAsyncExecutorEnabled(true); // 启用异步执行器
  18.     config.setExpressionManager(new SpringExpressionManager(applicationContext, null)); // 启用Spring表达式
  19.     return config;
  20. }
复制代码
二. 异步任务执行器配置

当服务任务标记为异步(flowable:async="true")时,任务由异步执行器处理。
配置异步执行器:
  1. @Bean
  2. public AsyncExecutor asyncExecutor(DataSource dataSource) {
  3.     DefaultAsyncExecutor asyncExecutor = new DefaultAsyncExecutor();
  4.     asyncExecutor.setDataSource(dataSource);
  5.     asyncExecutor.setCorePoolSize(5); // 核心线程数
  6.     asyncExecutor.setMaxPoolSize(10); // 最大线程数
  7.     asyncExecutor.setQueueSize(100); // 任务队列大小
  8.     return asyncExecutor;
  9. }
复制代码
在processEngineConfiguration中启用:
  1. config.setAsyncExecutor(asyncExecutor);
  2. config.setAsyncExecutorEnabled(true);
复制代码
异步任务依赖注入要点:


  • Bean作用域:异步任务可能在新线程中运行,确保注入的Bean是线程安全的或使用@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)。
  • 事务管理:若异步任务涉及数据库操作,需配置@Transactional并确保事务传播正确。
三、通过ApplicationContextAware接口的方式获取ApplicationContext对象实例
  1. 可能的错误情况包括:没有在流程引擎配置中设置asyncExecutorEnabled为true,或者在服务任务中没有正确使用表达式导致注入失败。另外,Bean的作用域问题也可能导致依赖注入失败,
  2. 例如,如果Bean的作用域是原型(prototype),但在注入时可能需要不同的处理方式。以下是我通过ApplicationContextAware接口的方式获取ApplicationContext对象实例,再通过applicationContext.getBean("myService")
  3. 方法获取对应的bean
复制代码
代码示例:
  1. @Component
  2. public class MyListener implements TaskListener, ApplicationContextAware {
  3.     private static  ApplicationContext applicationContext;
  4.     @Override
  5.     public void setApplicationContext(ApplicationContext arg0) throws BeansException {
  6.         applicationContext = arg0;
  7.     }
  8.     @Override
  9.     public void notify(DelegateTask delegateTask) {
  10.         String processInsId = delegateTask.getProcessInstanceId();
  11.         MyService myService = (MyService) applicationContext.getBean("myService");
  12.         // TODO 执行service方法
  13.         
  14.         System.out.println("==========执行监听器======");
  15.     }
  16. }
复制代码
四. 常见问题排查


  • 错误:无法解析表达式${myServiceTask}

    • 检查Bean名称是否匹配。
    • 确认流程引擎配置中设置了SpringExpressionManager。

  • 异步任务不执行

    • 检查asyncExecutor是否启动:调用asyncExecutor.start()。
    • 查看日志中是否有任务提交异常。

  • 事务不生效

    • 确保异步执行器配置了事务管理器:asyncExecutor.setTransactionManager(transactionManager);

五. Spring Boot集成

若使用flowable-spring-boot-starter,简化配置如下:
(1) application.yml
  1. flowable:
  2.   async-executor-enabled: true
  3.   database-schema-update: true
  4.   async-executor:
  5.     core-pool-size: 5
  6.     max-pool-size: 10
  7.     queue-size: 100
复制代码
(2) 服务任务类
  1. @Component
  2. public class EmailServiceTask implements JavaDelegate {
  3.     private final EmailService emailService;
  4.     public EmailServiceTask(EmailService emailService) {
  5.         this.emailService = emailService;
  6.     }
  7.     @Override
  8.     public void execute(DelegateExecution execution) {
  9.         String recipient = (String) execution.getVariable("email");
  10.         emailService.send(recipient, "流程通知", "您的任务已处理完成。");
  11.     }
  12. }
复制代码
(3) 流程定义XML
[code][/code]六.总结


  • 依赖注入:确保服务任务类为Spring Bean,流程中使用delegateExpression引用。
  • 异步执行:配置AsyncExecutor并启用,注意线程安全和事务。
  • ApplicationContextAware接口的方式获取ApplicationContext对象实例
  • Spring集成:正确配置SpringProcessEngineConfiguration以支持表达式和Bean解析。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册