我有以下批处理作业的步骤定义:
@Autowired
RetryContextCache retryContextCache;
@Bean
public Step correctionStep(JpaTransactionManager transactionManager) {
return new StepBuilder("correction-step", jobRepository)
.<String, List<BookingInfo>>chunk(10, transactionManager)
.reader(customItemReader())
.processor(correctionProcessor())
.writer(customItemWriter)
.taskExecutor(correctionTaskExecutor())
.faultTolerant()
.retryPolicy(retryPolicy())
.backOffPolicy(exponentialBackOffPolicy())
.retryContextCache(retryContextCache)
.skipPolicy(skipPolicy())
.build();
}
我有RetryContext
和RetryContextCache
的bean定义:
@Bean
RetryContextCache retryContextCache() {
return new MapRetryContextCache();
}
@Bean
RetryContext retryContext() {
return new RetryContextSupport(null);
}
现在,我在processor
中使用它们,如下所示:
@Component
public class CorrectionProcessor implements ItemProcessor <String, List <BookingInfo>> {
@Autowired
RetryContextCache retryContextCache;
@Autowired
RetryContext retryContext;
public List<BookingInfo> process(String bookingId) throws Exception {
List<BookingInfo> list = new ArrayList <> ();
if (retryContextCache.containsKey(bookingId)) {
list = (List<BookingInfo>) retryContextCache.get(bookingId).getAttribute(bookingId);
} else {
// fetch and populate list from database.
}
try {
// do something with the list.
} catch (Exception e) {
// modify something in the list.
retryContext.setAttribute(bookingId, list);
retryContextCache.put(bookingId, retryContext);
throw e;
}
}
}
您可以看到,我尝试在retryContextCache
中设置一些值,然后重新抛出异常,以使重试机制工作。
当重试发生时,它进入上面代码中提到的if
条件。但是,retryContextCache.get(bookingId).getAttribute(bookingId)
的值总是null
。
我在重试上下文中设置的值是否不正确?为什么不管用?
1条答案
按热度按时间xuo3flqw1#
我是这样解决这个问题的。
我想在重试开始之前保存对象状态。
RetryContext
的作用域在抛出错误后立即启动。因此,我无法设置RetryContext
中的值。因此,我创建了一个带有
StepScope
的bean:然后,我在需要的地方自动连接这个哈希。
然后,在catch块中重新抛出错误之前,我将修改后的对象写入此哈希。
然后,我为我的用例创建了一个
SkipListener
。这将在失败时捕获跳过的对象。然后,它将相应地完成各自的任务。刚刚将此
listener
注册到主作业中。