spring batch ItemReader FlatFileItemReader устанавливает курсор для начала чтения с определенной строки или динамически пропускает строки

В моей настройке springbatch + quartz я читаю файл CSV с помощью FlatFileItemReader. Я хочу установить курсор для читателя, чтобы он начал следующий экземпляр задания с заданными параметрами для читателя. Является ли это возможным?

<bean id="cvsFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <!-- Read a csv file -->
    <property name="resource" value="classpath:cvs/input/report.csv" />

    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer">
                <bean
                    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names" value="id,impressions" />
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean
                    class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                    <property name="prototypeBeanName" value="report" />
                </bean>
            </property>
        </bean>
    </property>

</bean>

Идея состоит в том, чтобы продолжить чтение файла, в котором произошла последняя ошибка, при следующем выполнении. Я помещаю целое число «writecursor» для каждой строки, написанной в моем customWriter.

public void write(List<? extends Report> items) throws Exception {

System.out.println("writer..." + items.size() + " > ");     
for(Report item : items){
    System.out.println("writing item id: " + item.getId());     
    System.out.println(item);

}
//getting stepExecution by implementing StepExecutionListener
this.stepExecution.getExecutionContext().putInt("writecursor", ++writecursor);

}

Теперь в customItemReadListener я хочу получить значение курсора записи обновления, а затем пропустить строки сверху, чтобы начать чтение из курсора записи.

public class CustomItemReaderListener implements ItemReadListener<Report>, StepExecutionListener {

    ApplicationContext context = ApplicationContextUtils.getApplicationContext();
    private StepExecution stepExecution;
    @Override
    public void beforeRead() {
        //Skip lines somehow
    }

Еще одна вещь, которую я видел в качестве возможного решения, - это установить динамический пропуск строк в программе чтения элементов. Здесь есть ветка http://thisisurl.com/dynamic-value-for-linestoskip-in-itemreader, но еще не ответил. А здесь http://forum.spring.io/forum/spring-projects/batch/100950-accessing-job-execution-context-from-itemwriter


person UserBSS1    schedule 31.01.2014    source источник
comment
Да, возможный дубликат. Я пробовал использовать свойство чтения строк. Но теперь я думаю, что, чтобы сохранить значение курсора в stepexecution, мне нужно сохранить его в jobexecutioncontext, поскольку значение курсора будет сброшено в следующем jobexecution. Как получить доступ к jobexecutioncontext в ItemReader / Processor / Writer?   -  person UserBSS1    schedule 31.01.2014
comment
Проверьте мой ответ. Но ИМХО вы только копируете встроенную функцию SB.   -  person Luca Basso Ricci    schedule 31.01.2014
comment
Я как бы пытаюсь создать настраиваемого администратора весенней партии с кварцем, поэтому мне нужно переопределить разные сценарии и вставить свою собственную логику   -  person UserBSS1    schedule 31.01.2014


Ответы (2)


Использовать FlatFileItemReader.linesToSkip свойство, заданное заданием по впрыскиванию Значение параметра.

<bean id="myReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <property name="linesToSkip" value="file:#{jobParameters['cursor']}" />
</bean>
person Luca Basso Ricci    schedule 31.01.2014
comment
он работает нормально для меня. Можно ли заменить jobParamertes на stepExecutionContext или jobExecutionContext? - person UserBSS1; 31.01.2014
comment
да, вы можете подключить его, чтобы вместо этого использовать данные stepExecution или jobExecution. - person Jackson Ha; 31.01.2014

Более простой способ реализовать пропуск строк:

создать читатель для чтения плоских файлов в xml, автоматически подключить читателя к прослушивателю выполнения шага beforeStep, как показано ниже

public class CustomStepListener implements StepExecutionListener {

    @Autowired
    @Qualifier("cvsFileItemReader")
    FlatFileItemReader cvsFileItmRdr;

    @Override
    public void  beforeStep(StepExecution stepExecution) {
        System.out.println("StepExecutionListener -------- beforeStep");            
        cvsFileItmRdr.setLinesToSkip(4);
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        System.out.println("StepExecutionListener - afterStep");
        return null;
    }

}

у меня все работает нормально .....

person Shamz    schedule 11.02.2015