我有一个很奇怪的问题。我需要说的是,我的代码在本地运行得很好,但没有在我们的pod(k8环境)中保存一些数据。
在此批处理中,我有不同的数据源可供使用。一切正常。Job Repository基于地图,并使用ResourcelessTransactionManager
@Configuration @EnableBatchProcessing public class BatchConfigurer extends DefaultBatchConfigurer { @Override public void setDataSource(DataSource dataSource){ } }
我还使用不同的平台transactionmanager,然后使用springbatch(问题)。所以我在财产中将spring-allow-bean覆盖设置为true。我的配置器中的平台事务管理器是右绑定的,我调试了它。
我的一个步骤是定制作家。更新多个dbs中的多个表中的记录(简而言之,不同的数据源)
public class MyWriter implements ItemWriter<MyDTO> { @Autowired private MyFirstRepo myfirstRepo; //table in first datasource @Autowired private MySecondRepo mySecondRepo; //table in second datasource @Override public void write(List<? extends MyDTO> myDtoList) throws Exception { //some logic mySecondRepo.delete(deletableEntity) //some logic mySecondRepo.saveAll(updatableEntities) //some logic myfirstRepo.saveAll(updatableEntities) } }
由于我有多个数据源,所以我定义了多个事务管理器,为了将事务管理器赋予我的步骤,我定义了包含这些管理器的链式事务管理器。
@Bean public Step myStep(@Qualifier("chainedTransactionManager") ChainedTransactionManager chainedTransactionManager) { return getCommonStepBuilder("myStep") .transactionManager(chainedTransactionManager) .<MyDTO,MyDTO>chunk(200) .reader(myPaginingReader()) .writer(myWriter) .taskExecutor(myTaskExecutor()) .throttleLimit(15) .build(); }
链式事务管理器配置(这两个事务管理器都是JpaTransactionManager):
@Configuration public class TransactionManagerConfig { @Primary @Bean(name = "chainedTransactionManager") public ChainedTransactionManager transactionManager( @Qualifier("firstTransactionManager") PlatformTransactionManager firstTransactionManager, @Qualifier("secondTransactionManager")PlatformTransactionManager secondTransactionManager) { return new ChainedTransactionManager(firstTransactionManager,secondTransactionManager); } }
因此,我在writer中的前两个jpa操作工作正常(对MyFirstRepo
进行的操作),但最后一个操作不是将数据持久化到db。它不会抛出任何错误,作业成功完成,但不会更新表中的记录。
我必须提到第二次,它确实在我的本地更新。只是没有在我们的k8环境(码头化微服务)应用程序中更新。这让它变得如此令人困惑。知道为什么会这样吗?