Java SchedulerFactory的单个实例可以有多少个触发器?

Java SchedulerFactory的单个实例可以有多少个触发器?,java,quartz-scheduler,Java,Quartz Scheduler,我的应用程序每天可能触发1000个或更多的触发器。其中每一项都分为4类: 上午(上午九时) 下午(下午1时) 晚上(下午六时) 晚上(晚上10时) 每一次,都会有100次的触发。下面是代码 SchedulerFactory schdFact = new StdSchedulerFactory(); Scheduler schd; for(ecah morningSchedulers){ // some logic for instantiating trigger AbstractT

我的应用程序每天可能触发1000个或更多的触发器。其中每一项都分为4类:

  • 上午(上午九时)
  • 下午(下午1时)
  • 晚上(下午六时)
  • 晚上(晚上10时)
每一次,都会有100次的触发。下面是代码

SchedulerFactory schdFact = new StdSchedulerFactory();
Scheduler schd;
for(ecah morningSchedulers){
  // some logic for instantiating trigger
  AbstractTrigger trigger = (AbstractTrigger) newTrigger().withSchedule(cronSchedule("0     0"+mAlert+"0,0,0 * * ?")).build();
  trigger.setStartTime(strtDat);
  trigger.setEndTime(endDat);
  final JobDetail job = newJob(AlertJob.class).build();
  schd.scheduleJob(job, trigger);
}
我这里有两个问题

  • 我应该为循环实例化内部调度程序还是外部调度程序,并将多个触发器调度到同一个调度程序。i、 e.schd=schdFact.getScheduler();我应该在哪里写这行?(循环的内部或外部)

  • 我必须重新安排一些触发器。i、 e.在某些情况下停止,然后重新开始

  • SchedulerFactory的单个实例可以有多少个触发器

    官方报告中有一个类似的问题:

    Quartz能够运行多少个作业? 这是一个很难回答的问题。。。答案基本上是“视情况而定”。[…]因此,Quartz可以“存储”和监视的触发器和作业数量的限制因素实际上是JobStore可用的存储空间量(RAM量或磁盘空间量)

    还要记住这一点:

    […]随时可以运行的作业的实际数量受线程池大小的限制。如果池中有五个线程,一次只能运行五个作业

    如果你有数千个<强>触发器>(你不混淆触发器和触发执行?),考虑JDBC存储。但如果您只有很少的触发器,但每天运行几次,RAM存储就足够了

    我应该为循环实例化内部调度程序还是外部调度程序,并将多个触发器调度到同一个调度程序

    对于整个应用程序,肯定只有一个调度程序。一个应用程序中很少有多个计划程序,请参阅:

    创建一次调度程序并将其视为单例

    我必须重新安排一些触发器。i、 e.在某些情况下停止,然后重新开始

    文档中再次解释了这一点:。基本上,您需要知道触发键:

    // retrieve the trigger
    Trigger oldTrigger = sched.getTrigger(triggerKey("oldTrigger", "group1");
    
    // obtain a builder that would produce the trigger
    TriggerBuilder tb = oldTrigger.getTriggerBuilder();
    
    // update the schedule associated with the builder, and build the new trigger
    // (other builder methods could be called, to change the trigger in any desired way)
    Trigger newTrigger = tb.withSchedule(simpleSchedule()
        .withIntervalInSeconds(10)
        .withRepeatCount(10)
        .build();
    
    sched.rescheduleJob(oldTrigger.getKey(), newTrigger);
    
    顺便说一句,如果只想在给定的一小时内运行作业,有一个更简单的API。而不是:

    newTrigger().
      withSchedule(
        cronSchedule("0     0"+mAlert+"0,0,0 * * ?")
      ).
      build()
    
    你可以简单地说:

    newTrigger().
      withSchedule(
        dailyAtHourAndMinute(mAlert, 42)
      ).
      build();
    

    请查看官方教程的链接。

    谢谢链接。是的,我有数千个触发器。你所说的触发器和触发器执行是什么意思?我的应用程序将在我定义的这4次向患者发送短信。每个使用者都有几个处方。每个处方都有开始和结束日期。所以在这种情况下,我必须启动几个触发器,对吗?因为它们各自有不同的数据,唯一的相似之处是时间(上午9点、下午1点、下午5点和晚上10点)。那么,我必须将这些触发器存储在数据库或其他什么地方吗?这就是你所说的jdbc存储。这对我有什么帮助?@Preethi:当你接触到数十万名患者时,触发器会占用大量的内存。此外,您还必须记住重新启动后如何重新创建触发器。如果你的申请在这段时间内被拒绝了呢?你的一般方法是很好的,但考虑只有4个触发(每小时一个),并发送批次短信给所有患者,应在一个特定的时间服药。这可能会扩展得更好。