【问题标题】:SpringBatch @Async method not working in persistent layer (JPAItemWriter)Spring Batch @Async 方法在持久层(JPAItemWriter)中不起作用
【发布时间】:2021-03-29 12:37:46
【问题描述】:

带有 SpringBatch 和 JPA 的 SpringBoot 应用程序,没有 @Async 一切正常,但在 REST API 中添加了 @Async,作业完成,但 JPAItemWriter 没有将对象保存在数据库中。看起来像事务问题,因为我得到了这个异常。

事务管理器 [org.sringframework.batch.support.transaction.ResourcelessTransactionManager] 不支持事务暂停

我尝试了不同的方法,例如更改 Propagation.Requires_New (Required, Supports) 但没有任何效果,尝试搜索所有论坛但没有运气。

@Service 
public class SampleWriter extends JpaItemWriter<TestEntity> {
       @Autowired
       EntityManager entityManager;

    @Transactional(readOnly=false, propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
    @Override
    public void write(List<TestEntity> entities) {
          this.doWrite(entityManager, entities);
    }
}

【问题讨论】:

    标签: spring-boot jpa spring-batch


    【解决方案1】:

    您似乎以错误的方式配置和使用 Spring Batch。

    首先,它使用默认的BatchConfigurerTransactionManagerResourcelessTransactionManager,主要用于测试或充当不需要任何事务的批处理作业的“无操作”TransactionManager这绝对不是你现在的情况。

    其次,Spring Batch 将在内部负责管理事务边界以处理每个块,您无需自行扩展JpaItemWriter 并使用@Transactional 控制事务行为。

    所以,阅读这篇section,了解如何配置Spring Batch,尤其是与BatchConfigurer相关的部分

    另一方面,如果您使用的是 Spring-boot ,它应该已经为您配置了 JpaBatchConfigurer

    【讨论】:

    • 不,你错了,PlatformTransactionManager 和 DataSource 是在 stepbuilderfactory 中注入的,我们使用 JpaItemWriter 来持久化实体 pojo,因为它有一个 doWrite API。使用 JPAItemWriter 没有问题,只是在异步模式下事务不在当前上下文中,这就是我们得到该异常的原因,因为它在正常模式下工作正常,没有任何问题。
    • 好的。只是一个简单的问题要自己问和思考,为什么你注入ResourcelessTransactionManager而不是JpaTransactionManager?如果你正确配置了spring-batch并且没有滥用它,你应该注入JpaTransactionManager。向我展示更多代码或将一个最小且可重现的示例项目放入一些 Github,如果我认为您足够谦虚和有礼貌,可以在说之前倾听和思考其他人的意见与您的想法相反,我很乐意研究它这是错误的。否则,祝你好运
    • 你可能是对的,我真的不明白 Async 方法在内部是如何工作的,让我创建一个这个用例的示例项目......仍然想知道没有 Async 方法它是如何工作的。非常感谢您的时间和帮助 - 非常感谢。
    • 您知道吗,您的提示确实有效...我刚刚删除了 PlatformTransactionManager 并使用了 JpaTransactionManager 并且一切正常。再次感谢...继续努力..
    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 2012-01-31
    • 2016-08-02
    • 2020-11-28
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多