在 Spring 批处理中将资源传递给处理器

Passing Resource to Processor in Spring Batch

我正在开发 Spring 批处理应用程序。在我的 reader 中,我正在从这样的路径读取 XML 文件:

ItemReader<Foo> xmlFileItemReader(){

    Resource[] resources = getResources();
    MultiResourceItemReader<Foo> reader = new MultiResourceItemReader<>();
    reader.setResources(resources);

    StaxEventItemReader<Foo> xmlFileReader = new StaxEventItemReader<>();
    xmlFileReader.setFragmentRootElementName("Foo");
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setClassesToBeBound(Foo.class);
    xmlFileReader.setUnmarshaller(marshaller);
    reader.setDelegate(xmlFileReader);
    return reader;
}

现在,我想在我的处理器中获取某些处理的资源详细信息。我无法在 Foo 中实施 ResourceAware,因为我无法更改它。所以,我尝试了这样的事情,

public class CustomFoo extends Foo implements ResourceAware{

@XmlTransient
private Resource resource;

@Override
public void setResource(Resource resource) {
    this.resource = resource;

}

}

然后我像这样修改了 reader,

ItemReader<CustomFoo> xmlFileItemReader(){

Resource[] resources = getResources();
MultiResourceItemReader<CustomFoo> reader = new MultiResourceItemReader<>();
reader.setResources(resources);

StaxEventItemReader<CustomFoo> xmlFileReader = new StaxEventItemReader<>();
xmlFileReader.setFragmentRootElementName("Foo");
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(CustomFoo.class);
xmlFileReader.setUnmarshaller(marshaller);
reader.setDelegate(xmlFileReader);
return reader;

}

我的处理器是这​​样的,

public class FooProcessor implements ItemProcessor<CustomFoo, Bar>{

@Override
public Bar process(CustomFoo item) throws Exception {
    //process
}

}

没用。它抛出一个 ClassCastException,因为它仍未编组为 Foo 对象。

我也试过使用 XmlAdapter。它也没有用。

我只想将 Resource 传递给我的处理器。请帮忙!提前致谢。

MultiResourceItemReader stores 当前资源在执行上下文中的索引(带键:resourceIndex)。这意味着如果您的 ItemProcessor 获得了执行上下文的访问权限,您就完成了。

现在为了从项目处理器访问执行上下文,您可以:

我见过有人在处理器中注入 MultiResourceItemReader 并在处理器内部调用 MultiResourceItemReader#getCurrentResource,但我不推荐这种方法,因为它会将你的处理器耦合到 reader .

希望这对您有所帮助。