Почему приведение типов требуется в приведенном ниже коде? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть отрывок, как указано ниже для пошаговой обработки.

@Bean
@JobScope
public Step readStep(StepBuilderFactory sbf, 
ItemReader reader,ItemWriter writer, TaskExecutor taskExecutor, 
RefFileReaderComponentFactory componentFactory, String file){
        final Step step = sbf.get(file)
                             .chunk(100)
                             .reader(reader)
                             .faultTolerant()
                             .skipPolicy(new SkipPolicy()) //dummy skip policy for representation purpose
                             .writer(writer)
                             .faultTolerant()
                             .skipPolicy(new SkipPolicy())
                             .listener(new NewStepExecutionListener()) //This dummy listener is implementation of the StepExecutionListener
                             //.listener(new NewItemWrtieListener) //This dummy listener is implementation of the ItemWriteListener
                             .taskExecutor(taskExecutor)
                             .build();
        return  step;
}

Но вышеприведенный код выдает ошибку времени компиляции - The method taskExecutor(TaskExecutor) is undefined for the type StepBuilderHelper.

Интересно, что эта ошибка отображается только в том случае, еслиЯ помещаю NewStepExecutionListener слушатель, но если я закомментирую его и раскомментирую NewItemWrtieListener, тогда он будет работать нормально.

После типизации, код выглядит так:

@Bean
@JobScope
public Step readStep(StepBuilderFactory sbf, 
ItemReader reader,ItemWriter writer, TaskExecutor taskExecutor, 
RefFileReaderComponentFactory componentFactory, String file){
        final Step step = ((AbstractTaskletStepBuilder<SimpleStepBuilder<Object, Object>>) sbf.get(file)
                             .chunk(100)
                             .reader(reader)
                             .faultTolerant()
                             .skipPolicy(new SkipPolicy()) //dummy skip policy for representation purpose
                             .writer(writer)
                             .faultTolerant()
                             .skipPolicy(new SkipPolicy())
                             .listener(new NewStepExecutionListener())) //This dummy listener is implementation of the StepExecutionListener
                             //.listener(new NewItemWrtieListener) //This dummy listener is implementation of the ItemWriteListener
                             .taskExecutor(taskExecutor)
                             .build();
        return  step;
}

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

Может кто-нибудь объяснить, почему?

1 Ответ

0 голосов
/ 13 мая 2019

Порядок вызовов методов имеет значение, потому что некоторые методы могут изменять тип компоновщика.Например, когда вы вызываете faultTolerant(), тип компоновщика изменяется с SimpleStepBuilder на FaultTolerantStepBuilder, добавляя новые методы для настройки отказоустойчивости (пропуск, повтор и т. Д.).

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

...