【问题标题】:Get current resource name using MultiResourceItemReader Spring batch使用 MultiResourceItemReader Spring 批处理获取当前资源名称
【发布时间】:2014-04-10 16:23:02
【问题描述】:

我在 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。 通过调试,批量进入更新方法

请帮忙!

【问题讨论】:

    标签: spring-batch xml


    【解决方案1】:

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

    【讨论】:

    • 你知道在 say commit-interval="10000" 上使用它时是否有任何显着的内存影响吗?
    • 老实说我从未使用过此功能,但我认为您必须将 10K 对象引用(资源引用)占用的空间 + 10K 项引用的唯一资源对象添加到内存使用中
    【解决方案2】:

    我尝试使用一个简单的侦听器从注入的 {@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...”

    【讨论】:

      【解决方案3】:
      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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-09
        • 2014-12-09
        • 2021-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 2018-10-05
        • 1970-01-01
        相关资源
        最近更新 更多