首页 > 解决方案 > 调用 Google Cloud Datastore 的 Tasklet 或 ItemReader

问题描述

我正在尝试创建一个调用DatastoreRepository. 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();
}

标签: springspring-batchspring-cloud

解决方案


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

如果您对 Spring Batch 元数据和您的业务数据使用不同的数据源,那么您需要配置一个 XA 事务管理器来同步两个数据源之间的事务。这样,在发生故障/重启情况时,数据和元数据都保持同步。

可以在此处找到类似的 Q/A:Separate datasource for jobrepository and writer of Spring Batch


推荐阅读