我正在寻找一种方法来处理我正在构建的自学式Web应用程序中的计划任务时,我看到了以下答案。 我正在使用与Netbeans一起安装的Quartz和Tomcat 8.0.27的最新版本。
Simple example for Quartz 2.2 and Tomcat 7
XML少
- 这需要Servet 3.0+(Tomcat 7 +,Glassfish 3 +,JBoss AS 7)
您只需要两个文件:上一个示例中的TestJob.java和 以下听众:
由于我没有使用Maven并且不想使用XML,因此我遇到了一些与之相关的问题,因为我在运行代码时遇到错误,启动Tomcat。
我正在尝试每12小时运行一次任务,时间是08:30和20:30
答案说不是
为避免冲突,请不要在web.xml中设置默认侦听器
但除非我在我的应用程序的web xml中设置Listener,否则它不会运行该作业。
<listener>
<listener-class>medsched.slisteners.MedSchedContextListener</listener-class>
</listener>
如果是这种情况,还是我误解了答案的这一部分?
即使使用突出显示的答案的间隔,我得到的错误也与Tomcat看到线程在不停止运行的情况有关。 它报告以下
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>
答案 0 :(得分:0)
根据QuartzInitializerListener
石英的源代码被关闭但waitOnShutdown
标志设置为false
,因此Tomcat在关闭之前不等石英完成,因此Tomcat决定它让线程运行并抱怨。
尝试在监听器配置中初始化quartz:wait-on-shutdown
至true
,以及shutdown-on-unload
属性,默认为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>