flowable任务监听器和java-service依赖注入问题
前言
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依赖注入问题的更多相关文章
- Java的依赖注入(控制反转)
两个主角"依赖注入"和"控制反转": 1.二都说的都是同一件事,只是叫法不同.是一个重要的面向对象编程的法则,也是一种设计模式: 2.英文原称:依赖注入,Dep ...
- 在ABAP里模拟实现Java Spring的依赖注入
Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...
- laravel框架中所用到的依赖注入
用Laravel开发前前后后有2个月左右了,之前一直写Java,就像找到Java和PHP之前的共同点,用Java的某些原理去理解PHP会发现还是有很多共通之处的.Java的依赖注入已经是一个很常见的概 ...
- [Android]使用Dagger 2依赖注入 - API(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5092525.html 使用Dagger 2依赖注入 - API ...
- 什么是控制反转(IOC)?什么是依赖注入?
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的.在传统编程方式中,业务逻辑的流程是应用程序中早已被设定好关联关系的对象来决定的 ...
- 依赖注入 DI 控制反转 IOC MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android 和 Dagger 2 中的依赖注入
原文:Dependency Injection in Android with Dagger 2 作者:Joe Howard 译者:kmyhy 在现代开发团队中到处充斥着"你一定要用依赖注入 ...
- 依赖注入 DI 控制反转 IOC 概念 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- golang常用库包:Go依赖注入(DI)工具-wire使用
google 出品的依赖注入库 wire:https://github.com/google/wire 什么是依赖注入 依赖注入 ,英文全名是 dependency injection,简写为 DI. ...
- java框架篇---spring IOC依赖注入
spring依赖注入的方式有4种 构造方法注入 属性注入 工厂注入 注解注入 下面通过一个实例统一讲解: User.java package com.bjsxt.model; public class ...
随机推荐
- K8S故障处理:临时设置节点为不可调度(cordon与drain区别)
在Kubernetes中,节点驱逐是一种管理和维护集群的重要操作,允许节点在维护.升级或者发生故障时从集群中移除,等到节点修复后,再重新承担pod调度功能. 1.K8s节点驱逐 节点驱逐是指将节点上运 ...
- unified-message(统一消息平台)开源项目介绍
unified-message(统一消息平台),为业务系统提供了标准的消息发送功能 支持发送短信.邮件.企业微信等消息,可以扩展支持其它的消息类型 可以通过手机号.邮件.企业微信用户名直接发送, 可以 ...
- C 国家名字按字母顺序排序
问题 输入五个国家的名字,并按字母的顺序排列输出 分析 知识点 strcpy(1,2):将字符串2复制到字符数组1中 strcmp(1,2):比较字符串大小 二维数组 代码 #include & ...
- C++:异常处理
C++的异常处理机制是由三部分组成:检查(try).抛出(throw)和捕获(catch).需要检查的语句放到try中:throw用来当出现异常时发出一个异常信息:catch用来捕获异常信息,且处理它 ...
- VulNyx - Mail 靶机
扫描靶机 发现22 和 80端口 访问80端口 发现id=1 和2 时都会有回显 dirsearch -u http://http://192.168.200.39 访问这个1 和 2的路径 发现竟然 ...
- 两个半成品的ORM
只要是有点结构化的思想,不可能项目里一个sqlHelper 满天飞 到处写 ,最终你的c#代码还是得返回一个Class 才好操作,sqlhelper, datatable这种东西也只是临时将就一下,稍 ...
- 一种把dump里连续的内存保存到文件的方法
前几天调试一个崩溃,截到一个full dump文件,显示一个视频帧数据转换有问题.从调用栈可以看到完整的帧数据. 然后我就想把这个数据保存下来,再构造崩溃场景,VS没有提供把内存dump为文件的功能. ...
- redis如何设置密码
密码设置 这里简单介绍一下redis如何设置密码redis密码设置有两种方式,一种需要重启redis服务,一种不需要重启redis服务. 首先,介绍一下需要重启redis服务的设置方式即找到redis ...
- Python 数
Python 数 在Python中,数字是编程中不可或缺的一部分.Python支持多种类型的数字,包括整数.浮点数等.下面我们将详细介绍这些数字类型以及它们之间的运算和格式化. 整数 整数是Pytho ...
- IDEA debug时候直接报ClassNotFoundException,代码正常,也可以正常运行
原因,是因为在某些类误点了断点,需要取消