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