Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 定制的MultiResourceItemReader:为存档中的每个文件分配不同的映射器/写入器_Spring_Spring Batch - Fatal编程技术网

Spring 定制的MultiResourceItemReader:为存档中的每个文件分配不同的映射器/写入器

Spring 定制的MultiResourceItemReader:为存档中的每个文件分配不同的映射器/写入器,spring,spring-batch,Spring,Spring Batch,我需要读取/处理包含几个平面文件的归档文件,每个文件都应该有自己的映射和编写器 如何为每个文件分配不同的fieldsetmapper和编写器 使用bean配置 我首先扩展了MultiResourceItemReader并重写了open方法 如图所示: @覆盖 公开作废打开(ExecutionContext ExecutionContext) 抛出项流异常{ ZipFile ZipFile; List resources=new ArrayList(); 试一试{ zipFile=新zipFile

我需要读取/处理包含几个平面文件的归档文件,每个文件都应该有自己的映射和编写器

如何为每个文件分配不同的
fieldsetmapper
和编写器 使用bean配置

我首先扩展了
MultiResourceItemReader
并重写了
open
方法 如图所示:

@覆盖
公开作废打开(ExecutionContext ExecutionContext)
抛出项流异常{
ZipFile ZipFile;
List resources=new ArrayList();
试一试{
zipFile=新zipFile(路径zipFile);
枚举zippedFile=zipFile.entries();
而(zippedFile.hasMoreElements()){
ZipEntry ZipEntry=(ZipEntry)zippedFile.nextElement();
添加(新的InputStreamResource(zipFile
.getInputStream(zipEntry),zipEntry.getName());
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
this.setResources(resources.toArray(新资源[resources.size()]);
super.open(executionContext);
}

bean声明如下所示:

<bean id="itemReader" class="com.proc.spring.ZipMResourceItemReader" scope="step">
        <property name="pathtozipfile" value="#{jobParameters['input.pathtozipfile']}" />
        <property name="delegate" ref="delegateReader" />   </bean>

 <bean id="delegateReader" class="org.springframework.batch.item.file.FlatFileItemReader">
        <property name="lineMapper1">
        <bean class="org.springframework.batch.item.file.mapping.." />
        </property>
   </bean>

我知道通过编程,我可以在读取期间使用
getCurrentResource()
,但我希望spring必须支持基于
MultiResourceItemReader
的当前资源分配不同的
FieldSetMapper
的能力


我想可能是第一步提取文件,然后将每个文件/资源分配到一个步骤:
FlatFileItemReader
将是一个解决方案,但如果可能的话,最好使用委托方法根据资源名称区分映射器/写入器。

首先:在前一步提取所有文件是最好的实践。

一个解决方案可以包括一个自定义的,用来分派给正确的读卡器,使其查看当前的资源名称;您可以手动或使用
分类器进行分派。此自定义读取器用作多资源项读取器的委托

class ReaderDispatcher implements ResourceAwareItemReaderItemStream<Object> {
  private ItemReader<Object> delegate1;
  private ItemReader<Object> delegate2;
  private ItemReader<Object> delegate1;
  private ItemReader<Object> currentDelegate;
  private Resource resource;

  public setResource(org.springframework.core.io.Resource resource) {
    this.resource = resource;
    currentDelegate = getDelegateFromResource();
  }
  public Object read() {
    return currentDelegate.read();
  }
  // Others interfaces implementation (or extends from one of abstract reader/stream implementations)
  private ItemReader getDelegateFromResource() {
    // here code to detect right reader from delegateN
  }
}
class ReaderDispatcher实现ResourceAwareItemReaderItemStream{
私人项目阅读器授权1;
私人项目阅读器授权2;
私人项目阅读器授权1;
私人委托;
私人资源;
公共setResource(org.springframework.core.io.Resource){
这个资源=资源;
currentDelegate=getDelegateFromResource();
}
公共对象读取(){
返回currentDelegate.read();
}
//其他接口实现(或从抽象读取器/流实现之一扩展)
private ItemReader getDelegateFromResource(){
//这里是从被委派者中检测正确读取器的代码
}
}
(很抱歉,代码未经测试/不完整;我无法检查它,但我希望您能看到背后的想法)。
您可以使用自己的fieldSetMapper或任何其他自定义项预先配置读卡器。

检查读卡器界面的编写器副本。

谢谢!!Luca,我同意第一步提取所有文件是最佳做法!我已经实现了一个原型,但是有其他的解决方案来比较总是很好的,所以这很方便。