在 Tomcat 上为 Webapp 安排任务
Schedule Task for Webapp on Tomcat
在我正在构建的自学网络应用程序中寻找处理计划任务的方法时,我看到了以下答案。
我正在使用最新版本的 Quartz 和随 Netbeans 安装的 Tomcat 8.0.27。
Simple example for Quartz 2.2 and Tomcat 7
XML-less
- This requires Servet 3.0+ (Tomcat 7+, Glassfish 3+, JBoss AS 7)
You only need two files: TestJob.java from the previous example and
the following listener:
因为我没有使用 Maven 并且不想使用 XML,我有一些与之相关的问题,因为我在 [=48= 上遇到错误]宁代码开始Tomcat。
我正在尝试每 12 小时 运行 任务,时间为 08:30 和 20:30
答案是不
To avoid conflicts, do not set the default listener in the web.xml
但除非我在我的应用程序的网络 xml 中设置侦听器,否则它不会 运行 工作。
<listener>
<listener-class>medsched.slisteners.MedSchedContextListener</listener-class>
</listener>
应该是这样吗,还是我误解了这部分答案?
我得到的错误,即使使用突出显示答案的间隔,也与 Tomcat 看到线程 运行ning 没有停止的事实有关。
它报告以下内容
18-Nov-2017 15:46:20.347 WARNING [http-nio-8084-exec-3] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads
The web application [medsched] appears to have started a thread named [DefaultQuartzScheduler_Worker-10] but has failed to stop it.
This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
我应该添加额外的代码来防止错误吗?
public class MedSchedContextListener extends QuartzInitializerListener{
private final static Logger LOG = LogManager.getLogger(MedSchedContextListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
super.contextInitialized(sce);
ServletContext ctx = sce.getServletContext();
StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QUARTZ_FACTORY_KEY);
try {
Scheduler scheduler = factory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MedSchedReminder.class).build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("simple").withSchedule(
CronScheduleBuilder.cronSchedule("0 30 8,20 1/1 * ? *")).startNow().build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (Exception e) {
LOG.error("There was an error scheduling the job.", e);
}
}
}
已编辑 web.xml 部分,现在可以停止错误。
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>medsched.slisteners.MedSchedContextListener</listener-class>
</listener>
根据 QuartzInitializerListener
的源代码,石英正在关闭,但 waitOnShutdown
标志设置为 false
,因此 Tomcat 没有等待石英完成在它关闭之前 Tomcat 决定它已经离开线程 运行 并抱怨。
除了已经默认为 true
的 shutdown-on-unload
属性 之外,尝试在您的侦听器配置中将 quartz:wait-on-shutdown
初始化为 true
(web.xml
).
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>true</param-value>
</context-param>
在我正在构建的自学网络应用程序中寻找处理计划任务的方法时,我看到了以下答案。 我正在使用最新版本的 Quartz 和随 Netbeans 安装的 Tomcat 8.0.27。
Simple example for Quartz 2.2 and Tomcat 7
XML-less
- This requires Servet 3.0+ (Tomcat 7+, Glassfish 3+, JBoss AS 7)
You only need two files: TestJob.java from the previous example and the following listener:
因为我没有使用 Maven 并且不想使用 XML,我有一些与之相关的问题,因为我在 [=48= 上遇到错误]宁代码开始Tomcat。
我正在尝试每 12 小时 运行 任务,时间为 08:30 和 20:30
答案是不
To avoid conflicts, do not set the default listener in the web.xml
但除非我在我的应用程序的网络 xml 中设置侦听器,否则它不会 运行 工作。
<listener>
<listener-class>medsched.slisteners.MedSchedContextListener</listener-class>
</listener>
应该是这样吗,还是我误解了这部分答案?
我得到的错误,即使使用突出显示答案的间隔,也与 Tomcat 看到线程 运行ning 没有停止的事实有关。 它报告以下内容
18-Nov-2017 15:46:20.347 WARNING [http-nio-8084-exec-3] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads
The web application [medsched] appears to have started a thread named [DefaultQuartzScheduler_Worker-10] but has failed to stop it.
This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
我应该添加额外的代码来防止错误吗?
public class MedSchedContextListener extends QuartzInitializerListener{
private final static Logger LOG = LogManager.getLogger(MedSchedContextListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
super.contextInitialized(sce);
ServletContext ctx = sce.getServletContext();
StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QUARTZ_FACTORY_KEY);
try {
Scheduler scheduler = factory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MedSchedReminder.class).build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("simple").withSchedule(
CronScheduleBuilder.cronSchedule("0 30 8,20 1/1 * ? *")).startNow().build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (Exception e) {
LOG.error("There was an error scheduling the job.", e);
}
}
}
已编辑 web.xml 部分,现在可以停止错误。
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>medsched.slisteners.MedSchedContextListener</listener-class>
</listener>
根据 QuartzInitializerListener
的源代码,石英正在关闭,但 waitOnShutdown
标志设置为 false
,因此 Tomcat 没有等待石英完成在它关闭之前 Tomcat 决定它已经离开线程 运行 并抱怨。
除了已经默认为 true
的 shutdown-on-unload
属性 之外,尝试在您的侦听器配置中将 quartz:wait-on-shutdown
初始化为 true
(web.xml
).
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>true</param-value>
</context-param>