Java 在运行时创建Quartz调度程序实例

Java 在运行时创建Quartz调度程序实例,java,quartz-scheduler,Java,Quartz Scheduler,我正在开发一个应用程序,其中我们有100个作业需要作为执行时间表。 这是我的示例quartz.property文件 org.quartz.scheduler.instanceName=QuartzScheduler org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.threadPool.threadCount=7 org.quartz.jobStore.driverDelegateClas

我正在开发一个应用程序,其中我们有100个作业需要作为执行时间表。 这是我的示例quartz.property文件

org.quartz.scheduler.instanceName=QuartzScheduler
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.threadPool.threadCount=7
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = myDS
org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz
org.quartz.dataSource.myDS.user=root
org.quartz.dataSource.myDS.password=root
org.quartz.dataSource.myDS.maxConnections=5
虽然这很好,但我们计划将工作分为不同的组,以便能够轻松地维护它们。 组将是唯一的,我们希望,如果userAdmin创建了一个新组,那么应该创建一个新的调度程序实例,并且该组中的所有作业将来都应该由该调度程序实例处理。 这意味着,如果管理员创建了一个新组,比如NewProductNotification,那么我们应该能够创建一个名为NewProductNotification的调度程序实例,所有属于NewProductNotification组的作业都应该由调度程序的NewProductNotification实例处理

这是怎么可能的?我们如何将此信息存储在数据库中,以便下次服务器启动时Quartz应该了解所有调度程序实例,或者我们是否需要在属性文件中添加有关新实例的此信息


正如上面的proprty文件所示,我们使用jdbcjobstore来处理数据库中的所有内容。

动态创建计划是非常可能的。您需要创建JobDetail对象并触发并传递给SchedulerFactoryBean对象。我认为动态创建调度程序在Quartz中不是一个好的设计方法。您可以为多个调度程序共享相同的数据库表作业详细信息,触发器的主键中包含调度程序名称,但调度程序有点重量级

你能解释一下为什么你真的需要单独的调度器吗?也许您可以简单地使用作业组和触发器组。实际上,您是在使用术语组来区分作业/组吗?您还可以为每个触发器使用不同的优先级

作为旁注: 我正在使用JobStoreCMT,我看到了死锁,我能做什么? 确保数据源中的线程池+2个连接中至少有个线程

在您的配置中,将值反转即可:

org.quartz.threadPool.threadCount=7
org.quartz.dataSource.myDS.maxConnections=5

发件人:

您能提供一些示例或链接吗?我使用的是simple Quartz scheduler,而不是spring来处理这个问题。对不起,我误解了您的问题。如果已经有另一个调度程序在运行,建议不要在同一数据库上启动多个调度程序。请参阅感谢您的回复,我们的想法是创建组并创建一个相同的调度程序,以便每个实例的负载更小。您认为调度程序的单个实例是否足以每天执行100个作业?@user702325:scheduler在这里不是瓶颈,它是一个数据库和工作线程。每天100个工作岗位并不多。同时有100个职位。但是在这种情况下,考虑单个调度程序的聚类,而不是启动多个调度程序,它们只会以负面的方式影响性能。