java Quartz Scheduler 关机后不停止
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3421852/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Quartz Scheduler not stopping after shutdown
提问by Yaniv Cohen
I'm using the currently latest quartz 1.8.3 on jboss 4.0.5. The quartz jobs are persistent and saved into a local database. When I call the shutdown or standby method on the executing quartz scheduler object jobs still continue to execute by the scheduler, only that the jobs state is empty and the execution fails.
我在 jboss 4.0.5 上使用当前最新的quartz 1.8.3。石英作业是持久的并保存到本地数据库中。当我对正在执行的quartz调度程序对象作业调用shutdown或standby方法时,调度程序仍然继续执行,只是作业状态为空并且执行失败。
I would expect (at least according to quartz API documentation) that when I shutdown or make the scheduler standby, that jobs previously scheduled into the database will not be executed.
我希望(至少根据石英 API 文档)当我关闭或使调度程序处于待机状态时,先前调度到数据库中的作业将不会执行。
If calling shutdown or standby on the scheduler is not the method to achieve that, what is?
如果在调度程序上调用 shutdown 或 standby 不是实现此目的的方法,那是什么?
The jobs are not just finishing the execution but planned jobs continue to be triggered.
作业不仅会完成执行,还会继续触发计划作业。
Here is additional info as asked:
以下是询问的其他信息:
public class QuartzNotificationsSchedulerBean implements NotificationsScheduler, ServletContextAware {
...
public String scheduleNotification(Notification notification) {
// Schedule the job with the trigger
try {
// Define job instance
String groupName = this.createNotificationGroupName(notification);
String triggerName = this.createNoficationTriggerName(notification);
String jobName = this.createNoficationJobName(notification);
JobDetail job = new JobDetail(jobName, groupName , ScheduledNotificationJob.class);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.putAll(notification.getContext());
job.setJobDataMap(jobDataMap);
Calendar notificationTime = notification.getTime();
Trigger trigger = new SimpleTrigger(triggerName, groupName , notificationTime.getTime());
scheduler.scheduleJob(job, trigger);
return trigger.getName();
} catch (SchedulerException e) {
throw new NotificationScheduleException(e, notification);
}
return null;
}
public void setServletContext(ServletContext servletContext) {
this.sf = (SchedulerFactory) servletContext.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
try {
scheduler = sf.getScheduler();
if(scheduler.isStarted() == false) {
scheduler.start();
}
} catch (SchedulerException e) {
logger.error("Failed to load Quartz scheduler ", e);
}
}
}
The following is a copy of the quartz configuration properties:
以下是石英配置属性的副本:
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = scheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.wrapJobExecutionInUserTransaction = true
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 45
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = FOR_QUARTZ
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000
#============================================================================
# Configure Datasources
#============================================================================
org.quartz.dataSource.FOR_QUARTZ.jndiURL = java:jdbc/live-quartz
Here is a snippet from the web.xml where the quartz is initialized:
这是初始化石英的 web.xml 中的一个片段:
<!-- START NOTIFICATION SERVICE -->
<context-param>
<param-name>config-file</param-name>
<param-value>wm_quartz.properties</param-value>
</context-param>
<context-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>
Thanks
谢谢
采纳答案by Adisesha
If there are any jobs executing when you call shutdown, whether to interrupt those jobs or not depends on the property org.quartz.scheduler.interruptJobsOnShutdown.
如果在调用 shutdown 时有任何作业正在执行,则是否中断这些作业取决于该属性org.quartz.scheduler.interruptJobsOnShutdown。
See http://jira.terracotta.org/jira/browse/QTZ-41?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel. I am unable to find more documentation on this.
见http://jira.terracotta.org/jira/browse/QTZ-41?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel。我无法找到更多关于此的文档。
The other property is org.quartz.scheduler.makeSchedulerThreadDaemon=true, which will shutdown quartz scheduler as soon as your calling thread shuts down. I do not know what happens to the state of the jobs.
另一个属性是org.quartz.scheduler.makeSchedulerThreadDaemon=true,一旦您的调用线程关闭,它就会关闭石英调度程序。我不知道工作状态会发生什么变化。
As mentioned in the comments, post some code and configuration to get clear answer.
如评论中所述,发布一些代码和配置以获得明确的答案。
回答by Ahmed Othman
you can use
org.quartz.plugin.shutdownhook.cleanShutdown=TRUEin your quartz properties file
您可以
org.quartz.plugin.shutdownhook.cleanShutdown=TRUE在您的石英属性文件中使用
回答by ??c C??ng Nguy?n
Please try to apply with these configuration when init scheduler
请尝试在 init scheduler 时应用这些配置
org.quartz.threadPool.makeThreadsDaemons=true
org.quartz.scheduler.makeSchedulerThreadDaemon=true
org.quartz.scheduler.interruptJobsOnShutdown=true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true
You can refer to this link for more detail: https://www.techpaste.com/2016/03/quartz-scheduler-shutdown/
您可以参考此链接了解更多详情:https: //www.techpaste.com/2016/03/quartz-scheduler-shutdown/

