Есть ли способ получить доступ к контексту выполнения внутри динамически созданного процессора (процессора POJO) в Spring Batch - PullRequest
0 голосов
/ 09 июля 2020

Я создал среду обработки на основе Spring Batch, которая позволяет мне определять задания на основе определения json. Я работаю с множеством различных задач по обработке данных, поэтому считаю полезным настроить их через JSON, а не писать десятки Java заданий. В основном это работает следующим образом:

  1. Я загружаю свое приложение с конфигурацией JSON, которая выглядит примерно так:
{
  "job_name": "some_job",
  "steps": [
    {
      "step_name": "step_1",
      "step_type": "CHUNK",
      "reader": {
        "reader_type": "CSV",
        "path": "/tmp/some.csv",
        "delimiter":";",
        ...
      },
      "processors": [
        {
          "processor_type": "ADD_SUFFIX",
          "source_column": "width",
          "target_column": "width_unit",
          "suffix": "cm"
        }
      ],
      "writer": {
        "writer_type": "CSV",
        "path": "/tmp/result.csv",
        "delimiter": ";"     
      }
    }
  ]
}

Такое определение в основном считывает некоторый файл CSV и добавить столбец width_unit на основе столбца width из исходного файла.

Процесс преобразования JSON -> Job основан на использовании Jackson's ObjectMapper magi c, например, например. Процессор будет сопоставлен с таким простым объектом ProcessorDefinition:
class SuffixProcessor extends ProcessorDefinition implements ItemProcessor<Row> {
    private String sourceColumn, targetColumn,suffix;
    
    @Override
    public Row process(Row row) throws Exception {
        return null;
    }
}

Как вы можете видеть, здесь нет никаких материалов, связанных с контекстом Spring. Просто простой предмет. То же самое касается шагов, читателей, писателей и т. Д. c. Общая структура вспомогательных объектов примерно такая:

JobDefinition job
steps:
      --StepDefinition step_1:
        --ReaderDefinition reader
        --processors:
          --ProcessorDefinition processor_1
          --ProcessorDefinition processor_2
          --ProcessorDefinition ...
        --WriterDefinition writer
      --StepDefinition step_2
        --ReaderDefinition ...

Затем я использую класс Configuration, чтобы превратить эти простые объекты в Spring Batch Job:
@Configuration
public class JobConfiguration {


    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    protected StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job getStepDefinitions() throws IOException {

        SimpleJobBuilder simpleJobBuilder = jobBuilderFactory
                .get(getJobDefinition().getName())
                .listener(jobListener)
                .start(getJobDefinition().getStepDefinitions().get(0));

        for (int i = 1; i < getJobDefinition().getStepDefinitions().size(); i++) {
            simpleJobBuilder.next(getJobDefinition().getStepDefinitions().get(i));
        }

        return simpleJobBuilder.build();

    }

    @Bean
    public JobDefinition getJobDefinition() throws IOException {
        // read the json file and map it to the JobDefinition object
        JobDefinition jobDefinition = mapper.readValue(json, JobDefinition.class);
        return jobDefinition;
    }
}

Итак, здесь мы переходим к задаче, созданной программно. До сих пор он работал нормально, так как мне нужно сохранить некоторые данные из контекста выполнения. Возникает вопрос:

Как мне получить доступ к ExecutionContext задания внутри объекта ProcessorDefinition? Решения на основе аннотаций не работают.

Пробовал ли кто-нибудь что-нибудь подобное? Я пытался добавить объект SpringContext к этим не bean-компонентам ProcessorDefinitions, как описано здесь: здесь , но bean-компонент ExecutionContext недоступен при выполнении proccess метода ProcessorDefinition.

...