在运行时创建Quartz Scheduler实例

时间:2012-03-24 14:40:29

标签: 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.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

虽然这样做很好,但我们计划将不同组中的工作分开,以便维护它们。 组将是唯一的,我们希望如果用户(管理员)创建新组,则应创建新的调度程序实例,并且该组中的所有作业将来都应由该调度程序实例处理。 这意味着如果管理员创建了一个新组,请说 NewProductNotification ,而不是我们应该能够创建一个具有相同名称​​ NewProductNotification 的调度程序实例,以及作为部分的所有作业NewProductNotification 组应由 NewProductNotification 调度程序实例进行处理。

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

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

2 个答案:

答案 0 :(得分:0)

动态创建计划非常有可能。您需要创建JobDetail和Trigger的对象并传递给SchedulerFactoryBean对象。它将照顾其余部分。

答案 1 :(得分:0)

我不认为在Quartz中动态创建调度程序是一种很好的设计方法。您可以为多个调度程序共享相同的数据库表(作业详细信息和触发器将调度程序名称作为其主键的一部分),但Scheduler是重量级的。

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

作为旁注:

  

我正在使用JobStoreCMT而且我看到了死锁,我该怎么办?

     

确保数据源中至少有线程池数+ 2个连接数。

在您的配置中(反转值,它会没问题):

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

来自:I'm using JobStoreCMT and I'm seeing deadlocks, what can I do?