Я создал среду обработки на основе Spring Batch, которая позволяет мне определять задания на основе определения json. Я работаю с множеством различных задач по обработке данных, поэтому считаю полезным настроить их через JSON, а не писать десятки Java заданий. В основном это работает следующим образом:
- Я загружаю свое приложение с конфигурацией 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.