我有一个来自HttpURLConnection的读者,有时可以产生500个HTTP响应。发生这种情况时,作业为FAILED且ItemStreamException:无法初始化读取器。有没有办法自动重试读取步骤(因为通常在3次重试后此端点将返回200 OK)?
我尝试了这个但是没有工作:
return stepBuilderFactory.get("step4")
.chunk(100)
.reader(httpurlreader())
.faultTolerant()
.retry(ItemStreamException.class)
.retryLimit(10)
.listener(new RetryReadListenerAdapter(retryReadListener()))
.writer(new someitemwriter())
.build();
更新
结束创建FaultTolerantItemStreamItemReaderWrapper,它可以包装读取操作并在open方法()上应用RetryTemplate。
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.support.AbstractItemStreamItemReader;
import org.springframework.retry.support.RetryTemplate;
public class FaultTolerantItemStreamItemReaderWrapper<T> extends AbstractItemStreamItemReader<T> {
private final AbstractItemStreamItemReader<T> itemStreamItemReader;
private final RetryTemplate retryTemplate;
public FaultTolerantItemStreamItemReaderWrapper(AbstractItemStreamItemReader<T> itemStreamItemReader, RetryTemplate retryTemplate) {
this.itemStreamItemReader = itemStreamItemReader;
this.retryTemplate = retryTemplate;
}
@Override
public void close() {
itemStreamItemReader.close();
}
@Override
public void update(ExecutionContext executionContext) {
itemStreamItemReader.update(executionContext);
}
@Override
public void setName(String name) {
itemStreamItemReader.setName(name);
}
@Override
public String getExecutionContextKey(String key) {
return itemStreamItemReader.getExecutionContextKey(key);
}
@Override
public void open(ExecutionContext executionContext) {
retryTemplate.execute(retryContext -> {
itemStreamItemReader.open(executionContext);
return null;
});
}
@Override
public T read() throws Exception {
return itemStreamItemReader.read();
}
}
然后我只是在设置阶段正常调用它:
return stepBuilderFactory.get("step4")
.chunk(100)
.reader(new FaultTolerantItemStreamItemReaderWrapper<>(httpurlreader(), retryTemplate()))
.writer(new someitemwriter())
.build();