Quartz scheduleJob函数无法正常工作

时间:2012-03-28 09:06:45

标签: java java-ee glassfish ejb quartz-scheduler

我的web应用程序中有一些预定的功能,可以在glassfish上运行。 这些功能计划在每天,每周,每月和每年运行。但只有每日预定的功能才会开始。请看一下代码:

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

但有趣的是当我改变浮动线的顺序时

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

所有功能都会在时机成熟时触发。这有意义吗。只需更改两个函数的顺序即可使代码正常工作。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我无法纠正您的代码,但这对我的项目有用。我已经使用Quartz通过一个Cron表达式来安排两个不同的事件,这个表达式在服务器启动时通过web.xml发送。以下是我的示例,供您参考。也许,你可以按照类似的方式来纠正你的代码...希望这会有所帮助。

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