Java 无法在Tasklet/ItemReader中读取REST参数

Java 无法在Tasklet/ItemReader中读取REST参数,java,rest,parameters,spring-batch,Java,Rest,Parameters,Spring Batch,我想设置一个新的批处理作业 这个作业应该从Rest接口接收一些参数(我正在使用@EnableBatchProcessing进行自动作业扫描) 我只希望在每次rest调用中执行一次任务->这就是为什么我认为tasklet是首选的武器。但是我没有让@StepScope使用仅tasklet的作业(似乎没有没有没有chunk的StepScope,但如果我错了,请纠正我) 我的另一个想法是创建一个ItemReader,它读取JobParameters并创建一个域对象(从参数),然后处理数据并写入一个虚拟I

我想设置一个新的批处理作业

这个作业应该从Rest接口接收一些参数(我正在使用@EnableBatchProcessing进行自动作业扫描)

我只希望在每次rest调用中执行一次任务->这就是为什么我认为tasklet是首选的武器。但是我没有让@StepScope使用仅tasklet的作业(似乎没有没有没有chunk的StepScope,但如果我错了,请纠正我)

我的另一个想法是创建一个ItemReader,它读取JobParameters并创建一个域对象(从参数),然后处理数据并写入一个虚拟ItemWriter

我尝试如下设置ItemReader:

@Bean
@StepScope
public ItemReader<BatchPrinterJob> setupParameterItemReader(
        @Value("#{jobParameters}") Map<String, Object> jobParameters) {

    ItemReader<BatchPrinterJob> reader = new ItemReader<BatchPrinterJob>() {

        @Override
        public BatchPrinterJob read()
                throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {

            BatchPrinterJob job = new BatchPrinterJob();
            LOG.info(jobParameters.toString());
            return job;
        }
    };
    return reader;
}
@Bean
@步进镜
公共项读取器设置参数读取器(
@值(“#{jobParameters}”)映射作业参数){
ItemReader=新的ItemReader(){
@凌驾
公共BatchPrinterJob读取()
引发异常、UnexpectedInputException、ParseException、非TransientResourceException{
BatchPrinterJob=新的BatchPrinterJob();
LOG.info(jobParameters.toString());
返回工作;
}
};
返回读取器;
}
我试图用如下的POST请求启动作业:myhost:8080/jobs/thisjobsname?name=testname

但唯一被记录的是run.id

我认为微线程将是首选的武器。但是我没有让@StepScope使用仅tasklet的作业(似乎没有没有没有chunk的StepScope,但如果我错了,请纠正我)

您可以在tasklet上使用
@StepScope
,以下是一个示例:

@Bean
@StepScope
public Tasklet tasklet(@Value("#{jobParameters['parameter']}") String parameter) {
    return (contribution, chunkContext) -> {
        // use job parameter here
        return RepeatStatus.FINISHED;
    };
}
然后使用tasklet创建步骤:

@Bean
public Step step() {
    return this.stepBuilderFactory.get("step")
            .tasklet(tasklet(null))
            .build();
}

好吧,我根据你的例子为这项工作编写了自己的启动器:

@RestController
public class AutoPrintLaunchingController {

@Autowired
private JobLauncher jobLauncher;

@Autowired
private AutoPrint autoprint;

@RequestMapping(value = "/jobs/AutoPrint", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.ACCEPTED)
public void launch(@RequestParam("Drucker") String printer, @RequestParam("Fach") String fach,
        @RequestParam("Dokument") String doc, @RequestParam("DokumentParameter") String param) throws Exception {

    JobParametersBuilder jpb = new JobParametersBuilder();
    jpb.addString("Drucker", printer);
    jpb.addString("Fach", fach);
    jpb.addString("Dokument", doc);
    jpb.addString("DokumentParameter", param);
    jpb.addDate("dateInstant", Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()));

    JobParameters jobParameters = jpb.toJobParameters();
    this.jobLauncher.run(autoprint.createAutoPrintJob(), jobParameters);
}

}

这是它的工作要求

谢谢,代码已编译,但参数的计算结果不是Rest参数:我尝试记录输出,但它的计算结果始终为null:
@Bean@StepScope public Tasklet Tasklet(@Value(“#{jobParameters['parameter']}”)字符串参数){return(contribution,chunkContext)->{LOG.info(chunkContext.getStepContext().getJobParameters().toString());LOG.info(“customParameter:+参数);返回RepeatStatus.FINISHED;};};}
这只记录更改的run.id+customParameter:Null在您的rest控制器中,您是否将请求参数作为作业参数传递?此答案显示了一个示例,您需要确保您试图在tasklet中获取的作业参数正确地从控制器传递到作业。我想这可能是问题所在。我们正在使用自动扫描作业并为其创建终结点的AutomaticObjRegistrar配置。是否有方法手动使用一个作业所需的参数覆盖终结点?或者我是否可以告诉AutomaticObjRegistrar扫描请求的参数?这与作业的注册方式无关,而是与作业的注册方式有关2.我的意思是,您的控制器应确保使用tasklet中所需的参数启动作业。以下是一个示例: