当前位置: 首页 > 面试题库 >

需要配置我的JPA层以使用TransactionManager(Spring Cloud Task +批处理意外注册PlatformTransactionManager)

麻烨
2023-03-14
问题内容

Spring Cloud Task + Batch在一个项目中使用。我计划对任务使用不同的数据源用于业务数据和Spring审核数据。所以我配置如下:

   @Bean
   public TaskConfigurer taskConfigurer() {
       return new DefaultTaskConfigurer(this.singletonNotExposedSpringDatasource());
   }

   @Bean
   public BatchConfigurer batchConfigurer() {
       return new DefaultBatchConfigurer(this.singletonNotExposedSpringDatasource());
   }

而主要数据源是通过进行自动配置的JpaBaseConfiguration

问题是当SimpleBatchConfiguration+
DefaultBatchConfigurer暴露一个PlatformTransactionManagerbean时出现的,因为JpaBaseConfiguration它具有@ConditionalOnMissingBeanon
PlatformTransactionManager。因此Batch's PlatformTransactionManager,绑定spring.datasource发生。

到目前为止,这似乎是由于此错误引起的

因此,我尝试模仿所做的事情,JpaBaseConfigurationPlatformTransactionManager在biz数据源/
entityManager上定义了自己的内容。

    @Primary
    @Bean
    public PlatformTransactionManager appTransactionManager(final LocalContainerEntityManagerFactoryBean appEntityManager) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(appEntityManager.getObject());
        this.appTransactionManager = transactionManager;
        return transactionManager;
    }

请注意,我必须使用以外的名称来定义它transactionManager,否则会Spring发现2个bean并抱怨(与无关@Primary!

但是现在它是有趣的部分。在运行测试时,一切都会顺利进行,测试已完成,并且DDLs已为业务和Batch/Task's数据库正确创建,数据库读取工作无懈可击,但是业务数据未持久保存在我的测试数据库中,因此最终assertThats失败时就无法计数。如果我@Autowire测试PlatformTransactionManager或中ÈntityManager,则一切都表明它们是正确的。但是,如果我在中调试entityRepository.save,然后执行org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus(),似乎DatasourceTransactionManagerfrom
Batch's配置已被覆盖,因此PlatformTransactionManager未使用我的自定义暴露。

因此,我想我的PlatformManager成为主要对象不是问题,但是正在配置JPA层TransactionInterceptor以使用非主要但transactionManager名为Batch的bean。

我也尝试使我的@Configuration工具TransactionManagementConfigurer和重写,PlatformTransactionManager annotationDrivenTransactionManager()但仍然没有运气

因此,我想我要问的是是否有一种方法可以为JPA层配置主TransactionManager。


问题答案:

当SimpleBatchConfiguration +
DefaultBatchConfigurer公开PlatformTransactionManager bean时,就会出现问题,

如您所述,这确实是BATCH-2788中报告的内容。我们正在探索的解决方案是
仅在 Spring Batch创建事务管理器bean 时才 公开它。

同时,您可以设置属性spring.main.allow-bean-definition- overriding=true以允许Bean定义覆盖,并设置要Spring
Batch与之配合使用的事务管理器BatchConfigurer#getTransactionManager。在您的情况下,它将类似于:

@Bean
public BatchConfigurer batchConfigurer() {
    return new DefaultBatchConfigurer(this.singletonNotExposedSpringDatasource()) {
        @Override
        public PlatformTransactionManager getTransactionManager() {
            return new MyTransactionManager();
        }
    };
}

希望这可以帮助。



 类似资料:
  • 我正在一个项目中使用。我计划对任务中的业务数据和Spring审计数据使用不同的数据源。所以我配置了如下内容: 而主数据源是通过自动配置的。 当公开一个bean时,问题就出现了,因为在上有一个。因此绑定到发生。 到目前为止,这似乎是因为这个错误造成的 因此,我试图模仿的功能,在我的业务数据源/entityManager上定义自己的。 注意我必须用以外的名称来定义它,否则会找到2个bean并抱怨(不管

  • 注册表是Windows系统的关键要素之一。 它包含有关操作系统各个方面的大量信息。 几乎所有安装在Windows系统上的应用程序都以某种形式与注册表交互。 注册表包含两个基本元素:键和值。 注册表项是与文件夹类似的容器对象。 注册表值是与文件类似的非容器对象。键可能包含值或其他键。 使用类似于Windows路径名称的语法来引用键,并使用反斜杠来指示层次结构的级别。 本章介绍查询值,添加,删除和编辑

  • 我正在尝试了解如何使用Spring。 我试着效仿这个例子。但是,当我从Eclipse启动Tomcat时,我得到了以下错误: 这是DispatcherServlet的相关代码。xml salvaUtente()是一种方法,我将在其中处理多个插入(现在仍然是exmpty)。

  • 批处理配置具有spring作业,只有一个步骤 1)读取器-从csv文件读取。处理器对文件应用一些规则。Drools请运行schema-postgresql.sql来设置数据库 WRITER使用SPRING DATA JPA写入DB Writer将此称为PersonDaoImpl:

  • 我是新的Spring批与引导。我在使用postgres配置jobRepositoryFactory bean作为数据库时遇到了一个问题。下面是我的配置类。 下面是Spring boot App run的输出 我已经在我的configuration类中配置了bean。我错过了什么?

  • 当我查看Spring Batch留档以并行执行步骤时,我只看到它通过XML的配置,如下所示。 我正在使用Spring批处理编写一个应用程序,我也使用了Spring Boot,我的所有配置都是使用注释完成的。是否有一个我可以使用Java配置来配置拆分步骤的方法?我查看了Spring Batch中Step interface的API文档,但它没有Split Step的默认实现。有没有办法使用现有的默认

  • 问题内容: 我有以下测试课: 问题似乎来自BaseTestConfiguration类: 我系统地得到了这个异常: 我不确定如何解决此问题。当我运行测试时,Spring不知何故正在寻找ServletContext并收到上述异常… 问题答案: 你的其中一门课程显然带有注释。这是如何结束在你的堆栈跟踪,因为它是进口的。 因此,尽管你认为自己不需要(因此也不需要),但实际上确实需要它,只是因为你正在使用

  • Spring Integration Java DSL Reference和Spring Batch Java配置文档说明了如何将Java配置用于Spring Integration和Spring Batch。 但它们没有说明如何为Spring批处理集成配置它。如何使用DSL配置JobLaunchingGateway? 干杯,曼诺