当前位置: 首页 > 知识库问答 >
问题:

实例化作业Quartz时出现异常

单于扬
2023-03-14

我试图将Quartz与spring boot一起使用,但我遇到了这个异常

2021-04-01 19:07:25.753错误13088---[SchedulerThread]org.quartz.core.errorlogger:实例化要执行的作业时发生错误。job='ecadb474-77b7-45bd-926a-caee31728465'

@Component
public class ClassJob extends QuartzJobBean {

    private static final Logger logger = LoggerFactory
        .getLogger(ClassJob.class);

    @Override
    public void executeInternal(JobExecutionContext jobExecutionContext)
        throws JobExecutionException {
        logger
            .info(
                "Executing Job with key {}",
                jobExecutionContext.getJobDetail().getKey());


        JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
        int controlRuleNum = jobDataMap.getInt("controlRuleNum");

        executeRule(controlRuleNum);
    }

    private void executeRule(int ebControlRuleNum) {
        System.out.println(ebControlRuleNum);
    }

}
@Configuration
public class QuartzSchedulerConfiguration {
    @Autowired
    ApplicationContext applicationContext;

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @PostConstruct
    public void init() {
        logger.debug("QuartzConfig initialized.");
    }

    @Bean
    public SchedulerFactoryBean scheduler() {
        SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();

        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        quartzScheduler.setJobFactory(jobFactory);

        return quartzScheduler;
    }

    @Bean
    public JobFactory jobFactory() {
        return new AutowiringSpringBeanJobFactory();
    }
}
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
    implements ApplicationContextAware {

    @Autowired
    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
        autowireCapableBeanFactory = applicationContext
            .getAutowireCapableBeanFactory();
    }

  @Override
    public Object createJobInstance(final TriggerFiredBundle bundle) {
    final Object job = super.createJobInstance(bundle);
    autowireCapableBeanFactory.autowireBean(job);
        autowireCapableBeanFactory
            .initializeBean(job, job.getClass().getName());
    return job;
  }

}
    private void scheduleJob(int ebControlRuleNum, Date date) {

        try {
            JobDataMap jobDataMap = new JobDataMap();
            jobDataMap.put("controlRuleNum", ebControlRuleNum);

            JobDetail jobDetail = JobBuilder
                .newJob(ClassJob.class)
                .withIdentity(UUID.randomUUID().toString(), "controlRule-jobs")
                .withDescription("call control rule Job")
                .usingJobData(jobDataMap).storeDurably().build();

            Trigger trigger = TriggerBuilder
                .newTrigger().forJob(jobDetail)
                .withIdentity(
                    jobDetail.getKey().getName(),
                    "controlRule-triggers")
                .withDescription("controlRule Trigger").startAt(date)

                .build();

            SchedulerFactory sf = new StdSchedulerFactory();
            Scheduler scheduler = sf.getScheduler();
            scheduler.start();
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException ex) {
            logger.error("Error scheduling email", ex);
        }

    }

有人能指出我哪里出了问题吗?

共有1个答案

单于越
2023-03-14

为了将来的参考,我添加了“spring-context-support”依赖项,它起作用了

 类似资料:
  • 如果有其他的方法来配置jHipster中的石英作业,请告诉我。或者,如果jHipster为调度程序工作提供了开箱即用的功能,那就太好了。 石英作业依赖关系

  • 我的we应用程序A将扫描业务相关的数据库表,并在启动期间和之后每10分钟安排石英作业。如果我在两个不同的tomcat实例上部署两个A应用程序,那么将有两组通过Quartz调度的重复作业。 我该如何解决这个问题?我是否需要将调度作业的部分代码提取到单独的应用程序中,并确保只部署了1个实例,从而只调度了1组作业?但是问题变成了--如果这个实例失败了怎么办?在这种情况下,如何实现故障转移?

  • 有人能帮我解决这个问题吗?

  • 问题内容: 我想知道如何在Quartz中从外部传递实例变量? 下面是我想写的伪代码。如何将externalInstance传递给此Job? 问题答案: 您可以将您的实例放在schedulerContext中。要计划作业时,可以在执行以下操作之前: 您的工作类别如下: 如果您使用的是Spring,那么您实际上可以使用spring的支持来注入整个applicationContext,就像在Link中回

  • 问题内容: 我正在使用Quartz Job执行特定任务。 我也在我的Main应用程序类中安排它的执行,而我试图完成的工作是不允许同时执行此作业的实例。 因此,调度程序仅应在其先前实例完成后才执行作业。 这是我的工作班级: 因此,在应用程序的主类中,我正在启动调度程序: 如果另一个实例仍在运行,我想阻止调度程序启动第二个MainJob实例… 问题答案: 只需在Job类顶部使用Annotation。