2012-03-28 7 views
0

Ich habe einige geplante Funktionen in meiner Webanwendung, die auf Glassfish läuft. Die Funktionen werden jeden Tag, jede Woche, jeden Monat und jedes Jahr ausgeführt. Aber nur die täglich geplante Funktion startet. Bitte werfen Sie einen Blick auf den Code:Quarz ZeitplanJob Funktion funktioniert nicht richtig

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..."); 
     } 
    } 
} 

Aber das Interessante ist, wenn ich die Reihenfolge der floowing Linien ändern

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 ?"); 

Da diese

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 ?"); 

Alle Funktionen ausgelöst werden wenn die Zeit reif ist. Macht das irgendeinen Sinn? Ändern Sie einfach die Reihenfolge der beiden Funktionen, damit der Code funktioniert. Fehle ich etwas?

Antwort

0

Ich kann Ihren Code nicht korrigieren, aber das hat bei mir in meinem Projekt funktioniert. Ich habe Quartz verwendet, um zwei verschiedene Ereignisse über einen Cron-Ausdruck zu planen, der beim Start des Servers über web.xml gesendet wird. Ein Beispiel dessen, was ich habe, ist unten für Ihre Referenz. Vielleicht können Sie auf ähnliche Weise Ihren Code korrigieren ... Hoffe, das hilft.

web.xml Eintrag

<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-Code

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(); 
     } 
    } 
} 
Verwandte Themen