2015-04-27 2 views
1

Я создал свой собственный ItemReader:Как инициализировать пользовательский ItemReader?

@Component("pricereader") 
public class MyItemReader implements ItemReader<Price>{ 

@Override 
public Price read() throws Exception, UnexpectedInputException, ParseException, 
     NonTransientResourceException { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

Назвав его в работу, определенной таким образом:

<batch:job id="job1"> 
    <batch:step id="step1"> 
     <batch:tasklet> 
      <batch:chunk reader="pricereader" processor="priceprocessor" writer="pricewriter" commit-interval="1"/> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

Этот itemReader должен анализировать данные из внешнего файла. я мог думать о чем-то вроде этого:

private Scanner scanner; 
public MyItemReader(String filepath){ 
     //initializing scanner 
} 

Во всяком случае я обнаружил, что конструктор вызывается при инициализации весной и мне не нравится идея держать открытое подключение к файлу в памяти. Кроме того, я бы хотел использовать этот ItemReader для чтения данных из нескольких файлов, поэтому добавление этой информации внутри конструктора тоже не очень хорошо ... любые идеи?

ответ

2

Что вы описываете, это именно то, для чего нужен интерфейс ItemStream. Интерфейс ItemStream. Интерфейс ItemStream предоставляет средства для управления состоянием компонента Spring Batch. Он включает в себя метод open, update и close, предназначенный специально для целей инициализации состояния, сохранения любого состояния и очистки любого состояния. В вашем случае открытие файла будет выполняться в методе open, а метод close будет обрабатывать закрытие дескриптора. Эти методы называются автоматически через Spring Batch framework и используются для того же самого в читателях, таких как FlatFileItemReader.

На самом деле, поскольку использование интерфейса ItemStream в сочетании с интерфейсом ItemReader настолько распространено, у нас есть агрегированный интерфейс ItemStreamReader, который расширяет оба. Вы можете узнать больше о интерфейсе ItemStream в документации: http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#itemStream

+1

Это место на! Глядя на код для «FlatFileItemReader», я смог реализовать наследование пользовательского считывателя из «AbstractItemCountingItemStreamItemReader», которое уменьшило сложность моего собственного кода до минимума. – oschlueter

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