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

如何使Quartz调度程序待机

索寒
2023-03-14

我有使用Spring的石英作业实现。我的调度程序工作正常,作业执行完美。我的问题是如何将此调度程序置于待机状态?这样一旦我决定将调度程序置于待机模式,就不会触发任何作业。下面是作业类

public class MyJobClass extends  QuartzJobBean  {
//my job logic
}

来自applicationContext_调度程序的代码片段。xml

<bean name="myJobBean"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="MyJobClass" />
</bean>         
<bean id="rsHourlyJobCronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobBean" />                       
<property name="cronExpression" value="00 0/1 * * * ?" />
</bean>

共有1个答案

阎功
2023-03-14

而不是用xml创建调度器bean。我会按如下程序制作:

@Configuration
public class QuartzSchedulerConfiguration {

  @Autowired
  private ApplicationContext applicationContext;

  @Bean
  public JobFactory jobFactory() {
    ApplicationContextHolder jobFactory = new ApplicationContextHolder();
    jobFactory.setApplicationContext(applicationContext);
    return jobFactory;
  }

  @Bean
  public SchedulerFactoryBean schedulerFactory() {
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setAutoStartup(true);
    factory.setSchedulerName("Quartz Scheduler");
    factory.setOverwriteExistingJobs(true);
    factory.setJobFactory(jobFactory());
    return factory;
  }
}

@Component
public final class ApplicationContextHolder extends SpringBeanJobFactory implements ApplicationContextAware {

  private static ApplicationContext context;

  private transient AutowireCapableBeanFactory beanFactory;

  @Override
  public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    beanFactory = ctx.getAutowireCapableBeanFactory();
    context = ctx;
  }

  @Override
  protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
    final Object job = super.createJobInstance(bundle);
    beanFactory.autowireBean(job);
    return job;
  }

  public static ApplicationContext getContext() {
    return context;
  }
}

这将创建石英调度器bean,该bean具有应用程序上下文意识,允许您将spring对象自动连接到石英作业中。

然后创建一些调度服务,如:

@Service
public class SchedulerService {

  @Autowired
  private SchedulerFactoryBean schedulerFactory;

  private Scheduler scheduler;

  @PostConstruct
  private void init() {
    scheduler = schedulerFactory.getScheduler();
  }

  public void standBy() throws Exception {
    if (scheduler != null && !scheduler.isInStandbyMode()) {
      scheduler.standby();
    }
  }
}

然后添加调度所需的其他方法。

 类似资料:
  • 问题内容: 我计划使用Quartz调度程序,因为我阅读了很多好的意见。 我的问题如下:在任何给定时间,系统中都会存在成千上万的触发器。大多数触发器将仅触发一个事件并死亡。另外,很有可能我将不得不在分配许多作业后取消它们(基于新的输入)。 石英可以缩放吗?推荐哪个JobStore?我计划在mysql上使用JDBC。 附加信息 :我的工作将发送电子邮件或通过HTTP发布将数据发布到其他服务(通过WAN

  • 我有一个配置了spring的quartz调度器,它有五个触发器来触发适当的作业。我想要的是有一个标志,我可以用来禁用开发和测试环境中的作业,并在生产中启用。下面是我的applicationContext中的配置。石英调度器的xml。 Cron触发器: 我尝试的内容:我尝试将cron表达式设置为feb31,这样它就永远不会运行,但这需要在数据库中运行代码更改或脚本。我需要的是:在我的weblogic

  • 如果这个问题太幼稚,我很抱歉,我希望作业被安排成一个一个地执行,而不是并行地执行,它只执行一次。 在文档中,@disallowConcurrentExecution是 null PS:我不知道会安排哪些工作。因此,如果作业已经在运行,我需要一些方法来动态链接作业。

  • 我使用Quartz Scheduler(使用JobDetailFactoryBean)和Spring来安排一些作业。现在我通过XmlApplicationContext通过spring配置实现了这一点,我必须将其更改为AnnotationConfigApplicationContext。那么,我如何在AnnotationConfigApplicationContext中实现这个cronjob呢。这

  • 问题内容: 请考虑这个例子。 一个示例Web应用程序要求其启动。调度程序配置为将其作业存储在DB中。 该应用程序被复制到六个Web服务器上。 因此,如果我们启动六个Web服务器,则在单个DB上将有六个具有相同名称的调度程序。如https://quartz- scheduler.org/documentation/quartz-2.1.x/cookbook/MultipleSchedulers中所述

  • 相关: 我觉得我错过了什么?