Tasklet 或 ItemReader,用于调用 Google Cloud Datastore



我正在尝试创建一个调用DatastoreRepository的 Spring Batch tasklet。 任务执行步骤

@Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
throws Exception {
String syncId = this.stepExecutionContext.getJobParameters()
.getString(JobParameterKeys.SYNC_ID);
SyncJob syncJob = syncJobRepo.findById(Long.parseLong(syncId)).get();

当我尝试调用 syncJobRepo 时,我收到org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope异常。

我有一个自定义配置的数据源(mySql 实例(支持 Spring Batch 用于存储作业执行元数据。

我试图定义DatastoreTransactionManager

@Bean
DatastoreTransactionManager datastoreTransactionManager() {
DatastoreTransactionManager manager
= new DatastoreTransactionManager(DatastoreOptions.getDefaultInstance().getService());
return manager;

}

我的配置带有注释@EnableBatchProcessing

批处理作业配置:

@Bean public Job customersJob(StepBuilderFactory stepBuilderFactory,
JobBuilderFactory jobBuilderFactory,
Tasklet batchCustomerReader,
SyncJobNotificationListener listener,
DatastoreTransactionManager datastoreTransactionManager) {
Step step = stepBuilderFactory.get(CUSTOMERS_BATCH_JOB_LOAD_FROM_ERP_STEP)
.tasklet(batchCustomerReader)
.transactionManager(datastoreTransactionManager)
.listener(listener)
.build();
return jobBuilderFactory.get(CUSTOMERS_BATCH_JOB)
.incrementer(new RunIdIncrementer())
.start(step)
.build();
}

我有一个自定义配置的数据源(mySql实例(支持Spring Batch,用于存储作业执行元数据。

如果对 Spring Batch 元数据和业务数据使用不同的数据源,则需要配置 XA 事务管理器以在两个数据源之间同步事务。这样,数据和元数据在发生故障/重新启动的情况下保持同步。

类似的问答可以在这里找到:单独的 jobrepository 和 Spring Batch 的写入器的数据源

最新更新