我在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。
通过调试,批处理进入更新方法
请帮忙!
答案 0 :(得分:2)
此问题有一个名为ResourceAware的特定界面:&#39}的目的是将当前资源注入从MultiResourceItemReader
读取的对象。
请查看this thread以获取更多信息。
答案 1 :(得分:0)
我尝试使用一个简单的Listener来记录注入的{@link MultiResourceItemReader}中的当前资源。将值保存到StepExecutionContext。
要使用步骤范围的MultiResourceItemReader,我可以直接访问代理,请参阅http://forum.springsource.org/showthread.php?120775-Accessing-the-currently-processing-filename,https://gist.github.com/1582202和https://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 ...”
答案 2 :(得分:0)
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;
}
}