首页 文章

在Tomcat上安排Webapp的任务

提问于
浏览
0

在我正在构建的自学式Web应用程序中寻找处理计划任务的方法时,我已经看到了以下答案 . 我正在使用与Netbeans一起安装的Quartz和Tomcat 8.0.27的最新版本 .

Simple example for Quartz 2.2 and Tomcat 7

XML-less这需要Servet 3.0(Tomcat 7,Glassfish 3,JBoss AS 7)您只需要两个文件:上一个示例中的TestJob.java和以下监听器:

由于我想使用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>

1 回答

  • 0

    根据 QuartzInitializerListener 石英的源代码被关闭但 waitOnShutdown 标志被设置为 false ,因此Tomcat没有等待石英在关闭之前完成,因此Tomcat决定它已经让线程运行并抱怨 .

    除了 shutdown-on-unload 属性之外,尝试在监听器配置中初始化 quartz:wait-on-shutdowntrue ,默认为 trueweb.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>
    

相关问题