石英调度器/多个(非集群)调度器实例
Quartz Scheduler / Multiple (Non Clustered) Scheduler Instances
对于我来说,我似乎无法弄清楚如何将 Quartz 配置为具有两个调度程序实例。我目前使用 quartz 来获取一个调度程序实例,但想要两个实例,如 documentation 中所述,因为我有一些轻量级的工作,我想在需要时 运行 同时限制一些重量级的工作工作到几个实例...就像文档描述的那样,但无法弄清楚。
任何人都可以给我一个简短的示例,说明属性文件应该是什么样子以及如何实例化单独的调度程序吗?
我没有通过属性文件配置它们的经验,但我的设置是这样的:
FileAppender fa = new FileAppender(new PatternLayout("%d{[dd/MM/yyy HH:mm:ss]} :: %2p :: %C{1} : %M :: %m%n"),
".\LogFiles\scheduler.log");
fa.setName("QuartzScheduler");
fa.setThreshold(Level.ALL);
fa.setAppend(true);
fa.activateOptions();
org.apache.log4j.Logger.getLogger("org.quartz").addAppender(fa);
org.apache.log4j.Logger.getLogger("org.quartz").setLevel(Level.INFO);
SimpleThreadPool threadPool = new SimpleThreadPool(25, Thread.NORM_PRIORITY);
JobStore jobStore = new RAMJobStore();
threadPool.setInstanceName("MyQuartz");
DirectSchedulerFactory.getInstance().createScheduler(threadPool, jobStore);
Scheduler operationScheduler = DirectSchedulerFactory.getInstance().getScheduler();
operationScheduler.start();
您没有理由不能创建一个小型工厂方法来配置诸如线程数量、实例名称、关联的日志文件等内容。这还可以让您的代码轻松扩展并且按需创建调度程序,而不是手动编辑文件。
我认为让多个实例工作的关键是确保将每个实例的名称设置为不同的名称。例如,我知道从 spring 配置多个调度程序时可能会导致问题(我相信这反映了石英本身的相同潜在问题。有关详细信息,请参阅此 spring 论坛 post:
在非Spring 环境中,您应该创建两个具有不同org.quartz.scheduler.instanceName
值的StdSchedulerFactory
实例。像这样:
Properties config1 = new Properties();
Properties config2 = new Properties();
config1.setProperty("org.quartz.scheduler.instanceName", "Scheduler1");
config2.setProperty("org.quartz.scheduler.instanceName", "Scheduler2");
Scheduler scheduler1 = new StdSchedulerFactory(config1).getScheduler();
Scheduler scheduler2 = new StdSchedulerFactory(config2).getScheduler();
对于我来说,我似乎无法弄清楚如何将 Quartz 配置为具有两个调度程序实例。我目前使用 quartz 来获取一个调度程序实例,但想要两个实例,如 documentation 中所述,因为我有一些轻量级的工作,我想在需要时 运行 同时限制一些重量级的工作工作到几个实例...就像文档描述的那样,但无法弄清楚。
任何人都可以给我一个简短的示例,说明属性文件应该是什么样子以及如何实例化单独的调度程序吗?
我没有通过属性文件配置它们的经验,但我的设置是这样的:
FileAppender fa = new FileAppender(new PatternLayout("%d{[dd/MM/yyy HH:mm:ss]} :: %2p :: %C{1} : %M :: %m%n"),
".\LogFiles\scheduler.log");
fa.setName("QuartzScheduler");
fa.setThreshold(Level.ALL);
fa.setAppend(true);
fa.activateOptions();
org.apache.log4j.Logger.getLogger("org.quartz").addAppender(fa);
org.apache.log4j.Logger.getLogger("org.quartz").setLevel(Level.INFO);
SimpleThreadPool threadPool = new SimpleThreadPool(25, Thread.NORM_PRIORITY);
JobStore jobStore = new RAMJobStore();
threadPool.setInstanceName("MyQuartz");
DirectSchedulerFactory.getInstance().createScheduler(threadPool, jobStore);
Scheduler operationScheduler = DirectSchedulerFactory.getInstance().getScheduler();
operationScheduler.start();
您没有理由不能创建一个小型工厂方法来配置诸如线程数量、实例名称、关联的日志文件等内容。这还可以让您的代码轻松扩展并且按需创建调度程序,而不是手动编辑文件。
我认为让多个实例工作的关键是确保将每个实例的名称设置为不同的名称。例如,我知道从 spring 配置多个调度程序时可能会导致问题(我相信这反映了石英本身的相同潜在问题。有关详细信息,请参阅此 spring 论坛 post:
在非Spring 环境中,您应该创建两个具有不同org.quartz.scheduler.instanceName
值的StdSchedulerFactory
实例。像这样:
Properties config1 = new Properties();
Properties config2 = new Properties();
config1.setProperty("org.quartz.scheduler.instanceName", "Scheduler1");
config2.setProperty("org.quartz.scheduler.instanceName", "Scheduler2");
Scheduler scheduler1 = new StdSchedulerFactory(config1).getScheduler();
Scheduler scheduler2 = new StdSchedulerFactory(config2).getScheduler();