spring - 调用 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();
}
解决方案
我有一个自定义配置的数据源(mySql 实例)支持 Spring Batch 用于存储作业执行元数据。
如果您对 Spring Batch 元数据和您的业务数据使用不同的数据源,那么您需要配置一个 XA 事务管理器来同步两个数据源之间的事务。这样,在发生故障/重启情况时,数据和元数据都保持同步。
可以在此处找到类似的 Q/A:Separate datasource for jobrepository and writer of Spring Batch
推荐阅读
- css - Angular:封装导致CSS冲突
- java - 从 MongoDB 获取 Java 中的集合
- php - 如何在类别页面中获取多个类别帖子?
- javascript - 创建自定义对话框/弹出框 HTML
- mysql - 根据MySql中具有最小和最大日期的记录选择差异
- swift - 单元测试 Quick and Numble - 未在覆盖范围内显示
- cordova - 关闭应用程序时收听事件 - Cordova/Phonegap
- c# - c#如何模拟鼠标输入?
- javascript - 如何在 cytoscape.js 中使用 cdn 添加扩展
- jquery - 如何从 JSON 数组中删除 JSON 对象?