使用MultiResourceItemReader Spring批处理获取当前资源名称

时间:2014-04-10 16:23:02

标签: spring-batch xml

我在Spring Batch中使用MultiResourceItemReader来读取多个XML文件,我想获得当前的资源。这是我的配置:

public class MultiFileResourcePartitioner extends MultiResourceItemReader<MyObject> {
    @Override
    public void update(final ExecutionContext pExecutionContext) throws ItemStreamException {
        super.update(pExecutionContext);
        if (getCurrentResource() != null && getCurrentResource().getFilename() != null) {
            System.out.println("update:" + getCurrentResource().getFilename());
        }
    }
}

我的读者:

<bean id="myMultiSourceReader"
   class="mypackage.MultiFileResourcePartitioner">
   <property name="resources" value="file:${input.directory}/*.xml" />

</bean>

上面的代码正确读取了XML文件,但方法getCurrentResources()返回null。 通过调试,批处理进入更新方法

请帮忙!

3 个答案:

答案 0 :(得分:2)

此问题有一个名为ResourceAware的特定界面:&#39}的目的是将当前资源注入从MultiResourceItemReader读取的对象。
请查看this thread以获取更多信息。

答案 1 :(得分:0)

我尝试使用一个简单的Listener来记录注入的{@link MultiResourceItemReader}中的当前资源。将值保存到StepExecutionContext。

要使用步骤范围的MultiResourceItemReader,我可以直接访问代理,请参阅http://forum.springsource.org/showthread.php?120775-Accessing-the-currently-processing-filenamehttps://gist.github.com/1582202https://jira.springsource.org/browse/BATCH-1831

public class GetCurrentResourceChunkListener implements ChunkListener, StepExecutionListener {

    private StepExecution stepExecution;
    private Object proxy;
    private final List<String> fileNames = new ArrayList<>();

    public void setProxy(Object mrir) {
        this.proxy = mrir;
    }

    @Override
    public void beforeStep(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        return stepExecution.getExitStatus();
    }

    @Override
    public void beforeChunk(ChunkContext cc) {
        if (proxy instanceof Advised) {
            try {
                Advised advised = (Advised) proxy;
                Object obj = advised.getTargetSource().getTarget();
                MultiResourceItemReader mrirTarget = (MultiResourceItemReader) obj;
                if (mrirTarget != null
                        && mrirTarget.getCurrentResource() != null
                        && !fileNames.contains(mrirTarget.getCurrentResource().getFilename())) {
                    String fileName = mrirTarget.getCurrentResource().getFilename();
                    fileNames.add(fileName);
                    String index = String.valueOf(fileNames.indexOf(fileName));
                    stepExecution.getExecutionContext().put("current.resource" + index, fileName);
                }
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    @Override
    public void afterChunk(ChunkContext cc) {
    }

    @Override
    public void afterChunkError(ChunkContext cc) {
    }
}

请参阅https://github.com/langmi/spring-batch-examples-playground了解工作示例 - 查找“GetCurrentResource ...”

答案 2 :(得分:0)

public class CpsFileItemProcessor implements ItemProcessor<T, T> {

    @Autowired
    MultiResourceItemReader multiResourceItemReader;

    private String fileName;

    @Override
    public FileDetailsEntityTemp process(T item) {
        if(multiResourceItemReader.getCurrentResource()!=null){
            fileName =  multiResourceItemReader.getCurrentResource().getFilename();
        }
    item.setFileName(fileName);
        return item;
    }
}