2012-03-28 163 views
0

我的web應用程序中有一些計劃的函數在glassfish上運行。 這些功能計劃每天,每週,每月和每年運行。但是隻有每日預定功能開始。請看一看代碼:Quartz scheduleJob函數無法正常工作

public class SchedulerServlet extends GenericServlet { 

    private static Boolean isLoaded = Boolean.FALSE; 

    @Override 
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 
    } 

    @Override 
    public String getServletInfo() { 
     return null; 
    } 

    private void scheduleCronJob(String ejbName, String methodName, String cronExpr) { 
     final String jobName = "quartz job: " + ejbName + "." + methodName; 
     System.out.println("SchedulerServlet.scheduleCronJob: ejbName: "+ ejbName +" methodname: "+ methodName +" cronExpr: "+ cronExpr); //asd 
     CronTrigger cronTrigger = new CronTrigger(jobName, "Quartz Trigger"); 
     try { 
      cronTrigger.setCronExpression(cronExpr); 
      scheduleJob(ejbName, methodName, cronTrigger, "-cron"); 
     } catch (Exception ex) { 
     System.out.println("STATE : " + "scheduleCronJob fonksiyonunda hata var.") ; 
      Logger.getLogger(SchedulerServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void scheduleSimpleJob(String ejbName, String methodName, Date time) { 
     System.out.println("SchedulerServlet.scheduleSimpleJob: ejbName: "+ ejbName +" methodname: "+ methodName +" time: "+ time); //asd 
     final String jobName = "quartz job: " + ejbName + "." + methodName; 
     SimpleTrigger simpleTrigger = new SimpleTrigger(jobName, "Quartz Trigger", time); 
     try { 
      scheduleJob(ejbName, methodName, simpleTrigger, "-simple"); 
     } catch (Exception ex) { 
     System.out.println("STATE : " + "scheduleSimpleJob fonksiyonunda hata var.") ; 
      Logger.getLogger(SchedulerServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void scheduleJob (String ejbName, String methodName, Trigger trigger, String tail) throws SchedulerException { 
     try { 
      final String jobName = "quartz job: " + ejbName + "." + methodName + tail; 
      JobDetail jd = new JobDetail(jobName , "Quartz Job", GFv3EJBInvokerJob.class); 
      jd.getJobDataMap().put("ejb", "java:module/"+ejbName); 
      jd.getJobDataMap().put("method", methodName); 
      System.out.println("SchedulerServlet.scheduleJob: ejbName: "+ ejbName +" methodname: "+ methodName +" trigger: "+ trigger +" tail: "+tail); //asd 
      Scheduler sched = StdSchedulerFactory.getDefaultScheduler(); 
      sched.scheduleJob(jd, trigger); 
      Logger.getLogger(SchedulerServlet.class.getName()).log(Level.INFO, null, jobName + " is scheduled..."); 
    } catch (Exception ex) { 
     System.out.println("STATE : " + "scheduleJob fonksiyonunda hata var.") ; 
    } 
    } 


    @Override 
    public synchronized void init(ServletConfig config) throws ServletException { 

     if (!isLoaded) { 
      super.init(config); 
      System.out.println("SchedulerServlet.init: "+config.toString()); //asd 
      scheduleCronJob("OFReportTimeoutService", "ofTimeout", "*/15 * * * * ?");//Seconds, Minutes, Hours, Day of month, Month, Day of week, Year 

      scheduleCronJob("ScheduledReportTimeoutService", "protectionInformationTimeout", "0 0 */3 * * ?"); 
      Calendar now = new GregorianCalendar(); 
      if (!(now.get(Calendar.HOUR)%3 == 2 && now.get(Calendar.MINUTE) > 40)) { 
       now.add(Calendar.MINUTE, 5); 
       scheduleSimpleJob("ScheduledReportTimeoutService", "protectionInformationTimeout", now.getTime()); 
      } 

      scheduleCronJob("ScheduledReportTimeoutService", "dailyTimeout", "0 0 4 * * ?"); 

      scheduleCronJob("ScheduledReportTimeoutService", "weeklyTimeout", "0 15 4 ? * MON"); 

      scheduleCronJob("ScheduledReportTimeoutService", "monthlyTimeout", "0 0 4 1 * ?"); 

      scheduleCronJob("ScheduledReportTimeoutService", "yearlyTimeout", "0 0 4 1 1 ?"); 

      isLoaded = Boolean.TRUE; 
     } 
     else { 
      System.out.println("STATE : " + "synchronized isn't running. isLoaded = TRUE") ; 
      System.out.println("STATE : " + "OFReportTimeoutService and protectionInformationTimeout services can't run.") ; 
      System.out.println("STATE : " + "synchronized isn't running. ") ; 
      Logger.getLogger(SchedulerServlet.class.getName()).log(Level.SEVERE, null, " isn't scheduled..."); 
     } 
    } 
} 

但有趣的是,當我改變所有的功能被觸發的floowing行的順序

scheduleCronJob("ScheduledReportTimeoutService", "dailyTimeout", "0 0 4 * * ?"); 

    scheduleCronJob("ScheduledReportTimeoutService", "weeklyTimeout", "0 15 4 ? * MON"); 

    scheduleCronJob("ScheduledReportTimeoutService", "monthlyTimeout", "0 0 4 1 * ?"); 

    scheduleCronJob("ScheduledReportTimeoutService", "yearlyTimeout", "0 0 4 1 1 ?"); 

由於這

scheduleCronJob("ScheduledReportTimeoutService", "weeklyTimeout", "0 15 4 ? * MON"); 

    scheduleCronJob("ScheduledReportTimeoutService", "dailyTimeout", "0 0 4 * * ?"); 

    scheduleCronJob("ScheduledReportTimeoutService", "monthlyTimeout", "0 0 4 1 * ?"); 

    scheduleCronJob("ScheduledReportTimeoutService", "yearlyTimeout", "0 0 4 1 1 ?"); 

在時機成熟時。這有意義嗎。只需更改這兩個函數的順序即可使代碼正常工作。我錯過了什麼嗎?

回答

0

我無法更正您的代碼,但這在我的項目中適用於我。我已經使用Quartz通過在服務器啓動時通過web.xml發送的Cron表達式來安排兩個不同的事件。下面是我的示例,供您參考。也許,你可以按照類似的路線來糾正你的代碼...希望這會有所幫助。

web.xml中進入

<servlet> 
     <servlet-name>QuartzInitializer</servlet-name> 
     <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet> 
     <servlet-name>QuartzServlet</servlet-name> 
     <servlet-class>com.xyz.SampleSchedulerServlet</servlet-class> 
     <init-param><param-name>firstCronExpr</param-name><param-value>7 0/1 * * * ?</param-value></init-param> 
     <init-param><param-name>secondCronExpr</param-name><param-value>7 0/20 * * * ?</param-value></init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 

servlet代碼

import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.servlet.GenericServlet; 
import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

import org.quartz.CronTrigger; 
import org.quartz.JobDetail; 
import org.quartz.Scheduler; 
import org.quartz.impl.StdSchedulerFactory; 


public class SampleSchedulerServlet extends GenericServlet { 
    private static Logger log = Logger.getLogger(SampleSchedulerServlet.class.getName()); 

    private static final long serialVersionUID = 1L; 
    private static final String FIRST_JOB_NAME = "First Sample Scheduler Job"; 
    private static final String FIRST_GROUP_NAME = "First Sample Scheduler Group"; 
    private static final String FIRST_TRIGGER_NAME = "First Sample Scheduler Trigger"; 
    private static final String SECOND_JOB_NAME = "Second Sample Scheduler Job"; 
    private static final String SECOND_GROUP_NAME = "Second Sample Scheduler Group"; 
    private static final String SECOND_TRIGGER_NAME = "Second Sample Scheduler Trigger"; 

    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
     log.log(Level.INFO, "Invoking scheduler for Sample.."); 
     try { 
      String cronExpression = getInitParameter("firstCronExpr"); 
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();    
      CronTrigger cronTrigger = new CronTrigger(FIRST_TRIGGER_NAME, FIRST_GROUP_NAME, cronExpression); 
      JobDetail jobDetail = new JobDetail(FIRST_JOB_NAME, FIRST_GROUP_NAME, SomeClass.class); 
      scheduler.scheduleJob(jobDetail, cronTrigger); 

      cronExpression = getInitParameter("secondCronExpr"); 
      scheduler = StdSchedulerFactory.getDefaultScheduler(); 
      cronTrigger = new CronTrigger(SECOND_TRIGGER_NAME, SECOND_GROUP_NAME, cronExpression); 
      jobDetail = new JobDetail(SECOND_JOB_NAME, SECOND_GROUP_NAME, SomeClass.class); 
      scheduler.scheduleJob(jobDetail, cronTrigger); 

      log.log(Level.INFO, "Sample Timer scheduled...");   
     } catch (Exception e) { 
      log.log(Level.SEVERE, "Problem invoking SampleSchedulerServlet to schedule the Sample jobs.."); 
      e.printStackTrace(); 
     } 
    } 

    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 
    } 

    public String getServletInfo() { 
     return null; 
    } 

    public void destroy() { 
     try { 
      Scheduler sched = StdSchedulerFactory.getDefaultScheduler(); 
      sched.shutdown(); 
      log.log(Level.INFO, "Shutting down Sample scheduler - Successful !"); 
     } catch (Exception e) { 
      log.log(Level.SEVERE, "Shutting down Sample scheduler - FAILED !"); 
      e.printStackTrace(); 
     } 
    } 
}