Java 将消息转换为作业,使其与批处理集成

Java 将消息转换为作业,使其与批处理集成,java,spring,spring-integration,spring-batch,spring-dsl,Java,Spring,Spring Integration,Spring Batch,Spring Dsl,我正在尝试以批处理方式使用Spring集成处理一系列文件。我有一个非常古老的xml,它试图将消息转换成作业 <int:transformer ref="messageToJobTransformer"/> <batch-int:job-launching-gateway job-launcher="jobLauncher"/> 这是我的门户豆 @Autowired private JobLauncher jobLauncher; @Bean publi

我正在尝试以批处理方式使用Spring集成处理一系列文件。我有一个非常古老的xml,它试图将消息转换成作业

    <int:transformer ref="messageToJobTransformer"/>
    <batch-int:job-launching-gateway job-launcher="jobLauncher"/>
这是我的门户豆

@Autowired
private JobLauncher jobLauncher;

@Bean
public MessageHandler jobLaunchingGw() {
    return new JobLaunchingGateway(jobLauncher);   
}
编辑:更新批处理配置类

@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;
}



}
@配置
@启用批处理
公共类BatchConfig
{
@自动连线
私人建筑工地;
@自动连线
私人StepBuilderFactorySteps;
@豆子
public ItemReader reader(@Value({jobParameters['input.file.name']})字符串文件名)引发格式错误的异常
{
FlatFileItemReader=新的FlatFileItemReader();
返回读取器;
}
@豆子
public Job Job()引发错误的DurLexException
{
返回jobs.get(“job”).start(步骤()).build();
}
@豆子
public Step()引发了畸形的DurLexException
{
返回steps.get(“step”).chunk(5).reader(reader())
.writer(writer()).build();
}
@豆子
公共ItemWriter编写器(@Value(“#{jobParameters['input.file.name']}”)
{
FlatFileItemWriter writer=新的FlatFileItemWriter();
返回作者;
}
}

您的问题不清楚。
JobLaunchingGateway
希望将
JobLaunchRequest
作为
有效负载

由于您的集成流是从
文件.inboundAdapter(目录)
开始的,因此我可以假设您有一些作业定义。因此,这里需要的是一个类,它可以解析文件并返回
JobLaunchRequest

类似于Spring批次的内容:


哦,这没有帮助。基本上,我正在轮询一个目录并批量处理文件。上面代码的问题是我无法看到作业,因为作业将在BatchConfig类中创建。如果在我获取异常之前发生,无法读取异常,如果在之后发生,作业将不可见。我想我已经到了一定程度我现在可以用Spring Integration Java DSL实现这一点。要么我必须为Spring DSL选择批处理和XML,要么完全放弃Spring Integration???不确定什么是
BatchConfig页面
,但您始终可以将一个bean注入另一个bean-
@Autowired
。在这方面共享更多配置,例如,对于
messageToJoB Transformer
。My bad应该将其编写为BatchConfig类。更新了sameOK。插入
作业()有什么问题
bean进入
FileMessageToJobRequest
组件?请参阅我答案中的更新。如果所有内容都将成为单个应用程序上下文,则可以插入并自动连接所需的所有内容。
@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;
}



}
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
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();

}