Преобразуйте сообщение в задание, чтобы сделать его Spring Интеграция с пакетной обработкой

Я пытаюсь обработать серию файлов с помощью Spring Integration в пакетном режиме. У меня есть очень старый xml, который пытается преобразовать сообщения в задания.

    <int:transformer ref="messageToJobTransformer"/>
    <batch-int:job-launching-gateway job-launcher="jobLauncher"/>

messageToJobTransformer — это класс, который может преобразовать сообщение в задание. Проблема в том, что я не знаю, где сейчас находится этот файл, и мне не нужна конфигурация xml. Я хочу, чтобы это был чистый Java DSL. Вот мой простой конфиг.

return IntegrationFlows.from(Files.inboundAdapter(directory)
                    .preventDuplicates()
                    .patternFilter("*.txt")))
                    .handle(jobLaunchingGw())                       
                    .get();

А вот и мой бин для шлюза.

@Autowired
private JobLauncher jobLauncher;

@Bean
public MessageHandler jobLaunchingGw() {
    return new JobLaunchingGateway(jobLauncher);   
}

РЕДАКТИРОВАТЬ: Обновление класса Batch Config.

@Configuration
    @EnableBatchProcessing
public class BatchConfig

{

@Autowired
private JobBuilderFactory jobs;

@Autowired
private StepBuilderFactory steps;




@Bean
        public ItemReader<String> reader(@Value({jobParameters['input.file.name']}") String filename) throws MalformedURLException
    {
        FlatFileItemReader<String> reader = new FlatFileItemReader<String>();       
        return reader;
    }
@Bean
public Job job() throws MalformedURLException
{
    return jobs.get("job").start(step()).build();
}

@Bean
public Step step() throws MalformedURLException
{
    return steps.get("step").<String, String> chunk(5).reader(reader())
    .writer(writer()).build();
}

@Bean
public ItemWriter<String> writer(@Value("#{jobParameters['input.file.name']}")
{
    FlatFileItemWriter writer = new FlatFileItemWriter();
    return writer;
}



}

person Harish    schedule 16.03.2016    source источник


Ответы (1)


Ваш вопрос не ясен. JobLaunchingGateway ожидает JobLaunchRequest как payload.

Поскольку ваш поток интеграции начинается с Files.inboundAdapter(directory), я могу предположить, что у вас есть некоторые определения работы. Итак, вам нужен какой-то класс, который может анализировать файл и возвращать JobLaunchRequest.

Что-то вроде этого из Справочного руководства Spring Batch:

public class FileMessageToJobRequest {
    private Job job;
    private String fileParameterName;

    public void setFileParameterName(String fileParameterName) {
        this.fileParameterName = fileParameterName;
    }

    public void setJob(Job job) {
        this.job = job;
    }

    @Transformer
    public JobLaunchRequest toRequest(Message<File> message) {
        JobParametersBuilder jobParametersBuilder =
            new JobParametersBuilder();

        jobParametersBuilder.addString(fileParameterName,
            message.getPayload().getAbsolutePath());

        return new JobLaunchRequest(job, jobParametersBuilder.toJobParameters());
    }
}

После определения этого класса как @Bean вы можете использовать его из метода .transform() EIP непосредственно перед вашим .handle(jobLaunchingGw()).

ОБНОВЛЕНИЕ

@Bean
public FileMessageToJobRequest fileMessageToJobRequest(Job job) {
     FileMessageToJobRequest fileMessageToJobRequest = new FileMessageToJobRequest();
     fileMessageToJobRequest.setJob(job);
     fileMessageToJobRequest.setfileParameterName("file");
     return fileMessageToJobRequest;
}
...

@Bean
public IntegrationFlow flowToBatch(FileMessageToJobRequest fileMessageToJobRequest) {

      return IntegrationFlows
            .from(Files.inboundAdapter(directory)
                    .preventDuplicates()
                    .patternFilter("*.txt")))
            .transform(fileMessageToJobRequest)
            .handle(jobLaunchingGw())                       
                    .get();

}
person Artem Bilan    schedule 16.03.2016
comment
о, это не помогло. В основном я опрашиваю каталог и обрабатываю файлы в пакетном режиме. Проблема с приведенным выше кодом заключается в том, что я не могу увидеть задание, потому что задание будет создано в классе BatchConfig. Если это произойдет до того, как я я получаю исключение, неспособное прочитать исключение, если это произойдет после того, как задание не видно. Я думаю, что я нахожусь в такой ситуации, что я никак не могу сделать это с помощью Spring Integration Java DSL. Либо мне нужно выбрать пакет и XML для Spring DSL или полностью отказаться от Spring Integration - person Harish; 16.03.2016
comment
??? Не уверен, что такое BatchConfig page, но вы всегда можете внедрить один компонент в другой - @Autowired. Поделитесь дополнительной конфигурацией по этому вопросу, например. для этого messageToJobTransformer. - person Artem Bilan; 16.03.2016
comment
Мой плохой должен был написать это как класс BatchConfig. Обновлено то же самое - person Harish; 16.03.2016
comment
ХОРОШО. В чем проблема внедрить этот компонент job() в компонент FileMessageToJobRequest? - person Artem Bilan; 16.03.2016
comment
Куда должен пойти метод трансформатора? Должен ли он быть в моем классе конфигурации? Первоначально я держал его в отдельном классе, как в FileMessageToJobRequest, но, поскольку задание не было видно, я переместил метод преобразования в свой класс конфигурации. По какой-то причине я получаю исключения. - person Harish; 17.03.2016
comment
Смотрите ОБНОВЛЕНИЕ в моем ответе. Если все будет единым контекстом приложения, вы можете внедрить и автоматически связать все, что вам нужно. - person Artem Bilan; 17.03.2016
comment
Все выглядит хорошо, за исключением того, что теперь мне нужно получить доступ к имени файла в пакете, к которому я обращаюсь из параметра задания EL1008E: (поз. 0): свойство или поле «параметры задания» не могут быть найдены в объекте типа «org.springframework.beans». .factory.config.BeanExpressionContext' - person Harish; 17.03.2016