Использовать параметры задания в mapper

#spring #spring-batch #jobs

#spring #spring-пакет #Вакансии

Вопрос:

Я создаю задание с помощью Spring Batch, задание запускается вручную с процессора Camel.

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

Вот моя работа:

     @Bean
    public LineMapper<MyEntity> lineMapper() {
        DefaultLineMapper<MyEntity> lineMapper = new DefaultLineMapper<MyEntity>();
        DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer() {
            {
                setNames(new String[] { "val1", "val2" });
            }
        };
        lineTokenizer.setDelimiter(";");

        lineMapper.setLineTokenizer(lineTokenizer);

        lineMapper.setFieldSetMapper(new MyEntityFieldsetMapper());

        return lineMapper;
    }

    public class MyEntityFieldsetMapper implements FieldSetMapper<MyEntity> {

        @Override
        public MyEntity mapFieldSet(FieldSet fieldSet) throws BindException {
            MyEntity MyEntity = new MyEntity();
            
            MyEntity.setValOne(fieldSet.readString("val1"));
            MyEntity.setValTwo(fieldSet.readString("val2"));
            
            // Here I need to set the variable in job parameters
            MyEntity.setValThree();

            return MyEntity;
        }
    }

    @Bean
    @StepScope
    public FlatFileItemReader<MyEntity> MyEntityFlatFileItemReader(
            @Value("#{jobParameters[inputCsvPath]}")
                    String inputCsvPath, @Value("#{jobParameters[myCustomVal]}")
                    String myCustomVal) {
        //Create reader instance
        FlatFileItemReader<MyEntity> reader = new FlatFileItemReader<MyEntity>();

        //Set input file location
        reader.setResource(new FileSystemResource(inputCsvPath));

        //Set number of lines to skips. Use it if file has header rows.
        reader.setLinesToSkip(0);

        //Configure how each line will be parsed and mapped to different values
        reader.setLineMapper(lineMapper());
        return reader;
    }

    @Bean
    public Job readCSVFilesJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory,
                               ItemReader<MyEntity> MyEntityItemReader, ItemWriter<MyEntity> MyEntityWriter) {

        Step step = stepBuilderFactory.get("step").<MyEntity, MyEntity>chunk(10000).reader(MyEntityItemReader)
                .writer(MyEntityWriter).build();

        return jobBuilderFactory.get("readCSVFilesJob").incrementer(new RunIdIncrementer()).start(step).build();
    }
  

Я могу получить jobParameters в ItemReader , но не могу передать его своему lineMapper и FieldSetMapper .

Есть ли способ сделать это?

Ответ №1:

Сделайте свой LineMapper шаг bean ограниченным и введите в него параметры задания, как вы это делали, например, для reader:

 @Bean
@StepScope
public LineMapper<MyEntity> lineMapper(@Value("#{jobParameters[inputCsvPath]}") String inputCsvPath) {
   // use job parameter here
}
  

Вам также может потребоваться объявить MyEntityFieldsetMapper как компонент с пошаговой областью действия, если вы хотите также ввести в него параметры задания.

Комментарии:

1. Как мне следует поступить с FieldSetMapper? Я могу добавить a, @StepScope но не @Bean , и поскольку это не функция, а класс, как я могу использовать параметры задания

2. Я сделал это, создав конструктор в моем FieldSetMapper и передав через него переменную.