spring - 如何在每个作业执行中只保留一个事务?
问题描述
我的spring-batch
配置包含一个包含多个步骤的作业。在一个步骤中,我从JMS
队列中读取消息,在另一个步骤中,我将数据写入数据库。我希望整个工作在同一个JTA
事务中执行
问题
- 当我创建阅读器
@Transactional
时,阅读器在接收到队列中的所有消息job
后提交事务,然后为编写器启动一个新事务。它不允许我在每个作业执行中保留单个事务;JMS
job
- 当我制作作业启动器
@Transactional
时,作业执行失败java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).
显然,JobRepositoryFactoryBean
该类添加了额外的顾问来检查是否存在活动事务,如果有则adviser
抛出异常。
我怎样才能满足要求?我剩下的唯一想法是采用某种配置方法(例如,在AbstractJob#executeAOP
上添加一个拦截器)。
我Atomikos
用来管理JTA
交易。JobRepository
有自己的DataSourceTransactionManager
实例和自己的DataSource
.
解决方案
推荐阅读
- python - 这是使用表单集更新现有数据的正确方法吗?
- c# - 使用 RedirectToAction 方法时视图内容不刷新
- amazon-web-services - 如何使用 CloudFormation 替换字符串变量中的字符
- angular - 如何在 Angular 中使用异步
- python - 尝试查找列表变量的索引时出错:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
- python - 传递参数 Python 的 Lambda 函数
- ios - 注销后找不到类型的 ObservableObject
- javascript - 未捕获的类型错误:无法在 playMusic 中设置 null 的属性“innerHTML”
- google-apps-script - 搜索驱动器和共享驱动器时如何正确检索数组长度?
- rust - 如何使用 actix-web 在 websocket 处理程序中启动守护程序?