我有一个简单的流程写入文件并且工作正常,但新要求意味着我需要记录在流程中写入的文件名。我已根据jobExecutionContext定义了一个在运行时生成文件的资源。
<bean id="fundAssetCsvFileWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<property name="resource">
<bean class="org.springframework.core.io.FileSystemResource">
<constructor-arg value="${policydetail.file}_#{jobExecutionContext['date']}_#{jobExecutionContext['fileSuffix']}.csv"/>
</bean>
</property>
我在扩展ItemListenerSupport
的自定义类上实现了afterWrite()public class ErrorLoggerListener extends ItemListenerSupport<Object, Object> {
...
@Override
public void afterWrite(List<? extends Object> item) {
logger.info("afterWrite() "+item.size());
}
}
此处显示作业的弹簧上下文
<batch:job id="base" abstract="true">
<batch:listeners>
<batch:listener ref="batchErrorLogListener"/>
</batch:listeners>
</batch:job>
<!--
The job
-->
<batch:job id="lmpTransferToFundAssetJob" parent="base">
..
<batch:step id="extractFundAssetCsvStep" parent="extractFundAssetCsv"/>
</batch:job>
<!-- Fund Asset Csv Extract -->
<bean id="extractFundAssetCsv" parent="simpleStep">
<property name="itemReader" ref="fundAssetReader"/>
<!-- the writer bean -->
<property name="itemWriter" ref="fundAssetCsvFileWriter"/>
</bean>
似乎在这个简单的设置中永远不会调用'batchErrorLogListener'。
我的第二个想法是扩展FlatFileItemWriter类并获取'resource'引用,以便在调用update()方法时记录资源文件名。这是我的基本类和日志记录的一个例子
public class RuntimeFlatFileItemWriter extends FlatFileItemWriter {
private static SeiLogger logger = SeiLogger.getLogger(RuntimeFlatFileItemWriter.class.getName());
private Resource resource = null;
@Override
public void setResource(Resource resource) {
super.setResource(resource);
this.resource = resource;
try {
logger.info("setResource "+this.resource.getFile().getAbsoluteFile());
} catch(IOException ioe){
logger.error(ioe);
}
}
@Override
public void update(ExecutionContext executionContext) {
logger.info("update");
super.update(executionContext);
try {
logger.info("Updated "+this.resource.getFile().getAbsoluteFile());
} catch(IOException ioe){
logger.error(ioe);
}
}
}
记录以下内容
11:45:39,683 INFO [RuntimeFlatFileItemWriter] setResource C:\projects\modules\hedging\.\output\AI_Fund_Asset_2014-07-24_LMP.csv
11:45:39,692 INFO [RuntimeFlatFileItemWriter] update
11:45:39,692 INFO [RuntimeFlatFileItemWriter] Updated C:\projects\modules\hedging\.\output\AI_Fund_Asset_2014-07-24_LMP.csv
11:45:39,946 INFO [RuntimeFlatFileItemWriter] update
11:45:39,947 INFO [RuntimeFlatFileItemWriter] Updated C:\projects\modules\hedging\.\output\AI_Fund_Asset_2014-07-24_LMP.csv
这个解决方案看起来有点沉重,我更愿意使用spring batch提供的基本类。任何人都可以推荐一种简单的方法来在同一个编写器步骤中访问资源文件名吗?