Spring批处理 - 重启失败读取步骤

时间:2016-10-12 13:51:40

标签: java spring spring-batch

我有一个来自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();

0 个答案:

没有答案
相关问题