2015-11-20 2 views
1

Мое требование - опросить два разных каталога для разных файлов формата (PSV и CSV) и обработать их с использованием весенней партии.Как обрабатывать файлы разных форматов с помощью весенней партии?

Я использовал адаптер входящего канала для опроса каталога. Но я не смог найти способ вызова соответствующего читателя, его токенизатора и полевого картографа на основе типа файла.

например. если это psv-вызов PSV-считыватель, преобразователь строки PSV , если это csv - вызов CSVReader, CSV-строка преобразователя

Любая помощь будет оценена.

Благодаря

+0

решения создать свой собственный читатель и применить соответствующую логику, основанную на расширение файла –

+0

Проверки HTTP: // stackoverflow.com/questions/33777596/parsing-several-csv-files –

ответ

1

Благодарим вас за все ваши предложения.

Я придерживался другого подхода. Я установил считыватель и запись в качестве параметра задания. Таким образом, в зависимости от типа файла, соответствующий читатель элемента и писатель будут вызван

<chunk reader= "#{JobParameter[bean.reader]}" writer="#{JobParameter[bean.writer]}"/> 

Благодаря

1

Вы можете создать свой собственный Reader: CustomFilesReader:

public class CustomFilesReader implements InitializingBean{ 

    private List<File> yourFiles= null; 

    public File read() { 
     if ((yourFiles!= null) && (yourFiles.size() != 0)) { 
      return yourFiles.remove(0); 
     } 
     return null; 
    } 

    //Reading Items from your dir 
    private void loadItems() { 
     this.yourFiles= new ArrayList<File>(); 
     // populate the items 
    } 


    @Override 
    public void afterPropertiesSet() throws Exception { 
     loadItems(); 
    } 
} 

Регистрация боб:

<bean id="customFilesReader " class="mypackage.CustomFilesReader "/> 


<bean id="myReader" 
    class="org.springframework.batch.item.adapter.ItemReaderAdapter"> 
    <property name="targetObject" ref="customFilesReader " /> 
    <property name="targetMethod" value="read" /> 
</bean> 

То же самое может быть сделано для пользовательских ItemProcessor и пользовательских ItemWriter ,

0

Альтернативой может быть создание класса, подобного ClassifierCompositeItemProcessor или ClassifierCompositeItemWriter. То есть требуется Classifier, список делегированных ItemReader и выбрать правильный ItemReader в зависимости от результата Classifier.

Проблема в том, что у вас нет ввода для классификации, поскольку чтение еще не завершено. Вот почему я думал об использовании свойства resource как элемента для классификации. Вот результат:

public class ResourceClassifierCompositeItemReader<T> implements ItemReader<T> { 

    private Classifier<String, ItemReader<? extends T>> classifier = new ClassifierSupport<String, ItemReader<? extends T>> (null); 
    private Resource resource; 

    public void setClassifier(Classifier<String, ItemReader<? extends T>> classifier) { 
     this.classifier = classifier; 
    } 

    @Override 
    public T read() throws Exception, UnexpectedInputException, ParseException { 
     return readItem(classifier.classify(resource.getFilename())); 
    } 

    private T readItem(ItemReader<? extends T> reader) throws Exception { 
     return reader.read(); 
    } 

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

} 

Теперь о том, как его использовать. Сначала вам понадобится MultiResourceItemReader, чтобы одновременно читать как .PSV, так и .CSV. Затем вам придется делегировать чтение на ResourceClassifierCompositeItemReader. Вам нужно будет добавить BackToBackPatternClassifier, чтобы классифицировать String resource.getFilename() (то есть имя файла) и вызвать ItemReader соответственно (через MatcherMap). Для этого вам нужно написать свой собственный RouterDelegate (взяв имя файла, разбить его, чтобы получить расширение, и вернуть его как строку, которую нужно сопоставить).

Смежные вопросы