Передача ресурсов процессору в Spring Batch - PullRequest
0 голосов
/ 25 октября 2018

Я работаю над приложением Spring Batch.В моем читателе я читаю 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;
}

Теперь в моем процессоре я хочу получить информацию о ресурсе для некоторой обработки.Я не могу реализовать ResourceAware в Foo, так как я не могу его изменить.Итак, я попробовал что-то вроде этого,

public class CustomFoo extends Foo implements ResourceAware{

@XmlTransient
private Resource resource;

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

}

}

И я изменил свой читатель следующим образом,

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 моему процессору.Пожалуйста помоги!Заранее спасибо.

1 Ответ

0 голосов
/ 25 октября 2018

MultiResourceItemReader хранит индекс текущего ресурса в контексте выполнения (с ключом: resourceIndex).Это означает, что если ваш ItemProcessor получает доступ к контексту выполнения, все готово.

Теперь, чтобы получить доступ к контексту выполнения из процессора элементов, вы можете:

Я видел, как люди вводят MultiResourceItemReader в процессор и вызывают MultiResourceItemReader#getCurrentResource внутри процессора, но я бы не рекомендовал этот подход, потому что он связывает ваш процессор считатель.

Надеюсь, это поможет.

...