是否可以在单个应用程序中同时使用这两个启动器?
我想将CSV文件中的记录加载到数据库表中。 Spring Batch表存储在不同的数据库中,因此我假设我需要使用JTA来处理事务。
每当我将@EnableBatchProcessing添加到我的@Configuration类时,它就会配置一个PlatformTransactionManager,它会停止由Atomikos自动配置。
是否有弹簧启动+批量+ jta样品显示如何执行此操作?
非常感谢, 詹姆斯
答案 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中的完整答案。