spring-boot-starter-jta-atomikos和spring-boot-starter-batch

时间:2015-04-28 13:39:05

标签: spring-boot spring-batch spring-data-jpa jta atomikos

是否可以在单个应用程序中同时使用这两个启动器?

我想将CSV文件中的记录加载到数据库表中。 Spring Batch表存储在不同的数据库中,因此我假设我需要使用JTA来处理事务。

每当我将@EnableBatchProcessing添加到我的@Configuration类时,它就会配置一个PlatformTransactionManager,它会停止由Atomikos自动配置。

是否有弹簧启动+批量+ jta样品显示如何执行此操作?

非常感谢, 詹姆斯

2 个答案:

答案 0 :(得分:1)

我刚刚经历过这个,我找到了似乎有用的东西。如您所知,String desc = BuildConfig.DESCRIPTION; 会导致创建@EnableBatchProcessing,这会弄乱一切。我在DataSourceTransactionManager中使用modular = true,因此@EnableBatchProcessing类已激活。

我做的是停止使用ModularBatchConfiguration,而是将整个@EnableBatchProcessing类复制到我的项目中。然后我注释掉了ModularBatchConfiguration方法,因为Atomikos配置创建了transactionManager()。我还必须覆盖JtaTransactionManager方法,因为它是硬编码的,可以使用jobRepository()内创建的DataSourceTransactionManager

我还必须明确导入DefaultBatchConfiguration类。这样可以正确地连接所有东西(根据Actuator的“bean”端点 - 感谢上帝)。但是当您运行它时,事务管理器会抛出异常,因为某处某处设置了显式的事务隔离级别。所以我还写了JtaAutoConfiguration r来查找事务管理器并调用BeanPostProcesso;

现在一切正常,但是当作业正在运行时,我无法使用txnMgr.setAllowCustomIsolationLevels(true)从batch_step_execution表中获取当前数据,即使我可以在SQLYog中看到数据。这必须与事务隔离有关,但我还没有理解它。

这是我的配置类,从Spring复制并修改如上所述。 PS,我的JdbcTemplate指向数据库,批处理表注释为DataSource。另外,我将@Primary bean更改为DataSource的实例;我不确定这是否必要。

org.apache.tomcat.jdbc.pool.XADataSource

答案 1 :(得分:0)

我找到了一个解决方案,我可以保留@EnableBatchProcessing但必须实现BatchConfigurer和atomikos bean,请参阅此so answer中的完整答案。