Spring batch 如何在运行作业时将运行时参数传递给Itemreader

Spring batch 如何在运行作业时将运行时参数传递给Itemreader,spring-batch,Spring Batch,我使用兔子消息队列和Spring批处理作为组合。Producer service将消息发布到队列。这里我的代码是消费者,我正在使用spring批处理来读取、处理和编写。这里,当消息推送到队列时,我必须触发作业(意味着没有控制器端点)。为此,我使用了@RabbitListener(“queue_Name),它将在新消息发布时进行侦听,并接收消息。下面是代码 @EnableRabbit public class Eventscheduler { @Autowired Job csv

我使用兔子消息队列和Spring批处理作为组合。Producer service将消息发布到队列。这里我的代码是消费者,我正在使用spring批处理来读取、处理和编写。这里,当消息推送到队列时,我必须触发作业(意味着没有控制器端点)。为此,我使用了@RabbitListener(“queue_Name),它将在新消息发布时进行侦听,并接收消息。下面是代码

@EnableRabbit
public class Eventscheduler {

    @Autowired
    Job csvJob;

    @Autowired
    private JobLauncher jobLauncher;

    //@Scheduled(cron="0 */5 * ? * *")
    @RabbitListener(queues ="BulkSolve_GeneralrequestQueue")
    public void trigger(){
        Reader.batchstatus=false;
        Map<String,JobParameter> maps= new HashMap<String,JobParameter>();

        maps.put("time", new JobParameter(System.currentTimeMillis()));
        JobParameters jobParameters = new JobParameters(maps);
        JobExecution execution=null;
        try {
            //JobLauncher jobLauncher = new JobLauncher();
             execution=jobLauncher.run(csvJob, jobParameters);
        } catch (JobExecutionAlreadyRunningException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JobRestartException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JobInstanceAlreadyCompleteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JobParametersInvalidException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("JOB Executed:" + execution.getStatus());

    }

}
@enablebrabbit
公共类事件调度器{
@自动连线
工作csvJob;
@自动连线
私有JobLauncher JobLauncher;
//@已计划(cron=“0*/5*?**”)
@RabbitListener(queues=“BulkSolve\u GeneralrequestQueue”)
公共无效触发器(){
Reader.batchstatus=false;
Map maps=新的HashMap();
maps.put(“time”,新作业参数(System.currentTimeMillis());
JobParameters JobParameters=新的JobParameters(地图);
JobExecution=null;
试一试{
//JobLauncher JobLauncher=新JobLauncher();
执行=jobLauncher.run(csvJob,jobParameters);
}捕获(JobExecutionalReadyRunning异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(JobRestartException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(JobInstancealReadyComplete异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}catch(作业参数sinvalidexception e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
System.out.println(“执行的作业:+execution.getStatus());
}
}
这里我的问题是,我已经在阅读已发布的消息,那么我如何将该消息pojo传递给ItemReader?在触发作业之前。这样我的ItemReader将阅读该消息。有人可以帮助我指导如何实现这一点吗

谢谢,

RabbitListener
注释中,您的注释方法可以将消息作为参数。例如:

@RabbitListener(queues ="BulkSolve_GeneralrequestQueue")
public void trigger(Message message){
    // use message as needed
}

然后,您可以访问收到的消息并将其用作作业的输入。

您好,马哈茂德,谢谢您的快速响应。是的,您是正确的,我在方法中还有@Payload,以便将消息绑定到我的pojo。在这里,我不知道如何在运行作业之前将该消息传递给Itemreader?在我的情况下,如果我将100条消息推到RabbitListener将识别这些消息(它将是启动作业的触发点)在这里,我可以读取并绑定100条消息到pojo。现在我想将pojo类列表传递给Item reader以进一步处理这些列表。您能帮助我如何实现这一点吗?我的意思是如何在运行它之前将从队列读取的pojo对象列表传递给ItemReader?我不确定您是否可以通过注释以声明方式执行此操作。您可以uld需要使用
rabbitTemplate
,以编程方式读取100条消息,然后将它们用作作业的输入。您是否考虑过使用?您可以使用此读取器创建作业,块大小为100。这种方法不需要队列上的侦听器。我不知道如何使用AMQpreder读取特定的队列和如何使用该阅读器创建作业?请给出一些示例代码。