【问题标题】:How to pass run time argument to Itemreader while running Job运行 Job 时如何将运行时参数传递给 Itemreader
【发布时间】:2018-09-05 13:23:28
【问题描述】:

我正在使用rabbit-messaging Queue和Spring batch作为组合。生产者服务将消息发布到队列。在这里,我的代码是消费者,我使用 Spring Batch 来读取、处理和写入。在这里,当消息推送到队列时,我必须触发作业(意味着没有控制器端点)。为此,我正在使用 @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());

    }

}

我的问题是,我已经在阅读已发布的消息,那么我如何将该消息 pojo 传递给 ItemReader?在触发 job.SO 之前,我的 ItemReader 将读取该消息。谁能帮助我指导如何实现这一目标?

谢谢,

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

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

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

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

    【讨论】:

    • 您好 mahmoud 感谢您的快速回复。是的,你是对的,我在方法中也有 @Payload,以便将消息绑定到我的 pojo。在这里,我不知道如何在运行 Job 之前传递可供 Itemreader 使用的消息?
    • 在我的情况下,如果我将 100 条消息推送到队列中。 RabbitListener 将识别这些消息(这将是启动 Job 的触发点)在这里我可以读取并将 100 条消息绑定到 pojo。现在我想将 pojo 类的列表传递给 Item reader 以进一步处理这些列表。您能帮我实现这一目标吗?
    • 我的意思是如何在运行之前将我从队列中读取的那些 pojo 对象列表传递给 ItemReader?
    • 我不确定您是否可以使用注释以声明方式做到这一点。您需要使用 rabbitTemplate 以编程方式读取 100 条消息,然后将它们用作工作的输入。您是否考虑过使用AmqpItemReader?您可以使用此阅读器和 100 的块大小创建作业。这种方法不需要队列上的侦听器。
    • 我不知道如何使用 AmqpReader 读取特定队列以及如何使用此阅读器创建作业?能否请您提供一些示例代码。
    猜你喜欢
    • 2012-05-05
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2018-05-22
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多