我试图将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);
}
}
有人能指出我哪里出了问题吗?
为了将来的参考,我添加了“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。