使用MultiResourceItemReader Spring batch获取当前资源名称

3

我正在使用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()返回空值。 通过调试,批量输入更新方法。
请帮忙!
更新: 我的下面的代码是正确的。我刚刚清理了项目,现在我可以获取当前资源。
3个回答

3

针对这个问题,有一个特定的接口称为ResourceAware:它的目的是将当前资源注入到从MultiResourceItemReader读取的对象中。
请查看此线程以获取更多信息。


1
你知道在使用 commit-interval="10000" 时是否会有任何显著的内存影响吗? - Michael Pralow
1
说实话,我从未使用过这个功能,但我认为您必须将10K个对象引用(资源引用)占用的空间和被10K个项目引用的唯一资源对象添加到内存使用中。 - Luca Basso Ricci

0

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

为了使其与步骤范围的MultiResourceItemReader配合工作,我直接访问代理,参见http://forum.springsource.org/showthread.php?120775-Accessing-the-currently-processing-filename, https://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..."


-1
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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接