前言

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

@Component("myServiceTask") // 使用名称便于流程中引用
public class MyServiceTask implements JavaDelegate { private final MyService myService; @Autowired // 构造器注入推荐
public MyServiceTask(MyService myService) {
this.myService = myService;
} @Override
public void execute(DelegateExecution execution) {
myService.businessMethod();
}
}
  • 步骤2:在流程定义中引用Bean
    使用delegateExpression指向Spring Bean的名称:

<serviceTask id="serviceTask1" name="My Task" flowable:delegateExpression="${myServiceTask}" />

常见问题解决:

  • Bean注入为null

    • 确保类被Spring扫描(位于@ComponentScan路径下)。

    • 检查流程定义中是否错误使用class属性而非delegateExpression

    • 确认流程引擎配置启用了Spring集成。

  • 表达式解析失败
    FlowableConfig中启用表达式解析和Spring注入:

@Bean
public SpringProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager) {
SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration();
config.setDataSource(dataSource);
config.setTransactionManager(transactionManager);
config.setDatabaseSchemaUpdate(Flowable.DB_SCHEMA_UPDATE_TRUE);
config.setAsyncExecutorEnabled(true); // 启用异步执行器
config.setExpressionManager(new SpringExpressionManager(applicationContext, null)); // 启用Spring表达式
return config;
}

二. 异步任务执行器配置

当服务任务标记为异步(flowable:async="true")时,任务由异步执行器处理。

配置异步执行器:

@Bean
public AsyncExecutor asyncExecutor(DataSource dataSource) {
DefaultAsyncExecutor asyncExecutor = new DefaultAsyncExecutor();
asyncExecutor.setDataSource(dataSource);
asyncExecutor.setCorePoolSize(5); // 核心线程数
asyncExecutor.setMaxPoolSize(10); // 最大线程数
asyncExecutor.setQueueSize(100); // 任务队列大小
return asyncExecutor;
}

processEngineConfiguration中启用:

config.setAsyncExecutor(asyncExecutor);
config.setAsyncExecutorEnabled(true);

异步任务依赖注入要点:

  • Bean作用域:异步任务可能在新线程中运行,确保注入的Bean是线程安全的或使用@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)

  • 事务管理:若异步任务涉及数据库操作,需配置@Transactional并确保事务传播正确。

三、通过ApplicationContextAware接口的方式获取ApplicationContext对象实例

可能的错误情况包括:没有在流程引擎配置中设置asyncExecutorEnabled为true,或者在服务任务中没有正确使用表达式导致注入失败。另外,Bean的作用域问题也可能导致依赖注入失败,

例如,如果Bean的作用域是原型(prototype),但在注入时可能需要不同的处理方式。以下是我通过ApplicationContextAware接口的方式获取ApplicationContext对象实例,再通过applicationContext.getBean("myService")

方法获取对应的bean

@Component
public class MyListener implements TaskListener, ApplicationContextAware { private static ApplicationContext applicationContext; @Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
applicationContext = arg0;
} @Override
public void notify(DelegateTask delegateTask) { String processInsId = delegateTask.getProcessInstanceId();
MyService myService = (MyService) applicationContext.getBean("myService"); // TODO 执行service方法 System.out.println("==========执行监听器======");
} }

四. 常见问题排查

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

    • 检查Bean名称是否匹配。

    • 确认流程引擎配置中设置了SpringExpressionManager

  • 异步任务不执行

    • 检查asyncExecutor是否启动:调用asyncExecutor.start()

    • 查看日志中是否有任务提交异常。

  • 事务不生效

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

五. Spring Boot集成

若使用flowable-spring-boot-starter,简化配置如下:

(1) application.yml

flowable:
async-executor-enabled: true
database-schema-update: true
async-executor:
core-pool-size: 5
max-pool-size: 10
queue-size: 100

(2) 服务任务类

@Component
public class EmailServiceTask implements JavaDelegate { private final EmailService emailService; public EmailServiceTask(EmailService emailService) {
this.emailService = emailService;
} @Override
public void execute(DelegateExecution execution) {
String recipient = (String) execution.getVariable("email");
emailService.send(recipient, "流程通知", "您的任务已处理完成。");
}
}

(3) 流程定义XML

<serviceTask id="sendEmail" flowable:delegateExpression="${emailServiceTask}" />

六.总结

  • 依赖注入:确保服务任务类为Spring Bean,流程中使用delegateExpression引用。

  • 异步执行:配置AsyncExecutor并启用,注意线程安全和事务。

  • ApplicationContextAware接口的方式获取ApplicationContext对象实例

  • Spring集成:正确配置SpringProcessEngineConfiguration以支持表达式和Bean解析。

flowable任务监听器和java-service依赖注入问题的更多相关文章

  1. Java的依赖注入(控制反转)

    两个主角"依赖注入"和"控制反转": 1.二都说的都是同一件事,只是叫法不同.是一个重要的面向对象编程的法则,也是一种设计模式: 2.英文原称:依赖注入,Dep ...

  2. 在ABAP里模拟实现Java Spring的依赖注入

    Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...

  3. laravel框架中所用到的依赖注入

    用Laravel开发前前后后有2个月左右了,之前一直写Java,就像找到Java和PHP之前的共同点,用Java的某些原理去理解PHP会发现还是有很多共通之处的.Java的依赖注入已经是一个很常见的概 ...

  4. [Android]使用Dagger 2依赖注入 - API(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5092525.html 使用Dagger 2依赖注入 - API ...

  5. 什么是控制反转(IOC)?什么是依赖注入?

    控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的.在传统编程方式中,业务逻辑的流程是应用程序中早已被设定好关联关系的对象来决定的 ...

  6. 依赖注入 DI 控制反转 IOC MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. Android 和 Dagger 2 中的依赖注入

    原文:Dependency Injection in Android with Dagger 2 作者:Joe Howard 译者:kmyhy 在现代开发团队中到处充斥着"你一定要用依赖注入 ...

  8. 依赖注入 DI 控制反转 IOC 概念 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. golang常用库包:Go依赖注入(DI)工具-wire使用

    google 出品的依赖注入库 wire:https://github.com/google/wire 什么是依赖注入 依赖注入 ,英文全名是 dependency injection,简写为 DI. ...

  10. java框架篇---spring IOC依赖注入

    spring依赖注入的方式有4种 构造方法注入 属性注入 工厂注入 注解注入 下面通过一个实例统一讲解: User.java package com.bjsxt.model; public class ...

随机推荐

  1. w3cschool-HBase官方文档-1配置

    https://www.w3cschool.cn/hbase_doc/ HBase 概述 HBase是Apache的Hadoop项目的子项目,是Hadoop Database的简称. HBase是一个 ...

  2. w3cschool-Scala 教程

    https://www.w3cschool.cn/scala/ Scala 教程关于基础基础知识(续)Finagle 介绍集合Searchbird模式匹配与函数组合类型和多态基础高级类型简单构建工具更 ...

  3. Vector不推荐使用的原因

    线程安全可以自己这么用:

  4. XLSReadWriteII5的使用示例

    procedure TForm1.Button1Click(Sender: TObject); var i, n: Integer; XLS: TXLSReadWriteII5; // 引用XLSRe ...

  5. android studio编译flutter项目

    1创建flutter项目:如下图 2选择 flutter application 3 出现flutter SDK没有发现:但是自己又是安装了的 如果,忘记自己flutter安装在哪里的同学. 可以先找 ...

  6. DAB实现中用到的主要设计模式

    DAB C++ 版本设计模式应用实践 1. 命令模式 (Command Pattern) 设计目标 模块解耦:实现各模块独立编译.测试.运行,消除模块间直接依赖 扩展准备:为桥接模式实现奠定基础 依赖 ...

  7. 管理虚拟机(virtual-manager)

  8. ORACLE 分页排序后的数据重复或缺失问题

    今天一大早业务人员就反映说用户导出的订单数据,有好几单是重复,并且缺失了某一单. 第一步:查询数据表.表里实际数据没有重复,也没有缺失.那么就可能是导出过程出错了(因为是异步分页导出,所以最先怀疑这部 ...

  9. flutter-全局控制键盘收回和单独控制键盘收回

    局部控制键盘收回 import 'package:flutter/material.dart'; import 'package:TLDF/main.dart'; class KeyboardBack ...

  10. 手把手教你更优雅的享受 DeepSeek

    开始之前,首先要确定你已经配置好Ollama软件并正常运行DeepSeek本地模型.如果这一步还不清楚,请翻看之前的手把手教程<手把手教你部署 DeepSeek 本地模型>. 本文是手把手 ...