在 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
获得了执行上下文的访问权限,您就完成了。
现在为了从项目处理器访问执行上下文,您可以:
- 使用
@BeforeStep
方法并存储步骤执行上下文的句柄,如 Passing Data to Future Steps 部分所述
- 让你的
ItemProcessor
实现ItemStream
接口
我见过有人在处理器中注入 MultiResourceItemReader
并在处理器内部调用 MultiResourceItemReader#getCurrentResource
,但我不推荐这种方法,因为它会将你的处理器耦合到 reader .
希望这对您有所帮助。
我正在开发 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
获得了执行上下文的访问权限,您就完成了。
现在为了从项目处理器访问执行上下文,您可以:
- 使用
@BeforeStep
方法并存储步骤执行上下文的句柄,如 Passing Data to Future Steps 部分所述
- 让你的
ItemProcessor
实现ItemStream
接口
我见过有人在处理器中注入 MultiResourceItemReader
并在处理器内部调用 MultiResourceItemReader#getCurrentResource
,但我不推荐这种方法,因为它会将你的处理器耦合到 reader .
希望这对您有所帮助。