首页 > 解决方案 > 如何在调度配置器中添加多个 spring 批处理作业?

问题描述

因此,下面的示例 java 类配置将从数据库中动态获取 CRON 作业表达式。到目前为止,它仅适用于 1 个工作。但是,我有另一项工作并尝试通过调用 addTriggerTask 方法添加它,但由于此错误,工作失败。有什么建议可以触发多个工作吗?

   ERROR: required a single bean, but 2 were found
    
   Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
@Configuration
@EnableScheduling
public class DynamicScheduler implements SchedulingConfigurer {

    private static Logger LOGGER = LoggerFactory.getLogger(DynamicScheduler.class);

    @Autowired
    ConfigRepo repo;

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    private Job job;


    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        taskRegistrar.addTriggerTask(() -> executeJob("job1"), t -> {
            CronTrigger crontrigger = new CronTrigger(repo.findById("cronExpressionJob1").get().getConfigValue());

            return crontrigger.nextExecutionTime(t);
        });

    }

    public void executeJob(String jobName) {        

        try {

            JobParameters jobParameters = new JobParametersBuilder()
                    .addString(jobName, String.valueOf(System.currentTimeMillis())).toJobParameters();

            jobLauncher.run(job, jobParameters);
        } catch (Exception e) {
            LOGGER.error("Failed due to exception thrown.", e);
        }

    }

}

标签: spring-batchquartz-scheduler

解决方案


在您当前的代码中,您@Autowired用于将 aJob注入DynamicScheduler. 当您只有一个工作时,这是明确的,但是一旦您添加另一个工作,Spring 就无法消除您要注入的工作的歧义

这就是您看到错误的原因:

错误:需要一个 bean,但找到了 2 个

行动:考虑将其中一个 bean 标记为 @Primary,更新消费者以接受多个 bean,或使用 @Qualifier 来识别应该使用的 bean

如果您想处理多个作业,那么我建议@Autowired private Job job;从您的班级中删除并使用JobRegistry将您Job的名称作为局部变量查找。然后将其Job与它一起传递JobParametersjobLauncher.run()

// get JobParameters for jobName
Job job = jobRegistry.getJob( jobName );
jobLauncher.run( job, jobParameters );

推荐阅读