Spring批量集成 - 远程分块从属异常

时间:2017-07-05 18:16:23

标签: java spring spring-integration spring-batch

用于确保从站上的异常映射到主站上的响应以指示远程步骤实际上已失败的标准配置是什么?

目前在从站上的服务激活器中发生的任何异常都会完全停止流程,并且在整个事情超时之前我对主站没有任何响应。我可以在奴隶上添加几次重试(使用手册中的this信息)但是如果它完全失败或者是例外我不想重试我需要将失败响应发送到立即掌握。

遗憾的是,关于远程分块的文档相当稀疏,我无法找到任何显示如何处理它的内容。

1 个答案:

答案 0 :(得分:1)

使用分区时,无论成功/失败,都应该返回StepExecution

@ServiceActivator
public StepExecution handle(StepExecutionRequest request) {

    Long jobExecutionId = request.getJobExecutionId();
    Long stepExecutionId = request.getStepExecutionId();
    StepExecution stepExecution = jobExplorer.getStepExecution(jobExecutionId, stepExecutionId);
    if (stepExecution == null) {
        throw new NoSuchStepException("No StepExecution could be located for this request: " + request);
    }

    String stepName = request.getStepName();
    Step step = stepLocator.getStep(stepName);
    if (step == null) {
        throw new NoSuchStepException(String.format("No Step with name [%s] could be located.", stepName));
    }

    try {
        step.execute(stepExecution);
    }
    catch (JobInterruptedException e) {
        stepExecution.setStatus(BatchStatus.STOPPED);
        // The receiver should update the stepExecution in repository
    }
    catch (Throwable e) {
        stepExecution.addFailureException(e);
        stepExecution.setStatus(BatchStatus.FAILED);
        // The receiver should update the stepExecution in repository
    }

    return stepExecution;

}

StepExecutionRequestHandler)。

通过分块,无论如何都应该ChunkResponse ......

@ServiceActivator
public ChunkResponse handleChunk(ChunkRequest<S> chunkRequest) throws Exception {

    if (logger.isDebugEnabled()) {
        logger.debug("Handling chunk: " + chunkRequest);
    }

    StepContribution stepContribution = chunkRequest.getStepContribution();

    Throwable failure = process(chunkRequest, stepContribution);
    if (failure != null) {
        logger.debug("Failed chunk", failure);
        return new ChunkResponse(false, chunkRequest.getSequence(), chunkRequest.getJobId(), stepContribution, failure.getClass().getName()
                + ": " + failure.getMessage());
    }

    if (logger.isDebugEnabled()) {
        logger.debug("Completed chunk handling with " + stepContribution);
    }
    return new ChunkResponse(true, chunkRequest.getSequence(), chunkRequest.getJobId(), stepContribution);

}

ChunkProcessorChunkHandler