Quartz Job不会执行包含异常的方法(try / catch或throws)

时间:2015-12-19 15:06:16

标签: java quartz-scheduler job-scheduling

正如标题所述,我正在尝试使用Quartz安排定期工作来发送电子邮件。 基本的工作测试工作得很好(一些hello world print等),但是一旦我调用一个带有try / catch子句或抛出一个exeption的方法,这个工作就不会调用它。 您可以在下面找到负责工作处理的不同代码。

BAPJob.java:我想要执行的工作

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.echallenge.util.MailService;

public class BAPJob implements Job {

    public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("EXECUTION STARTING ...");

        MailService.test();

        System.out.println("EXECUTION ENDING");
    }

}

MailService.Java:包含我要调用的方法的类

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

public class MailService {

    public static void test(){
        System.out.println("TESTING I ...");

        try {
            InternetAddress.parse("to-email@gmail.com");
        } catch (AddressException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

JobInitializer.java:启动作业的servlet(在web.xml中有2个值)

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Servlet implementation class JobInitializer
 */
public class JobInitializer extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {

        try {
            JobDetail job = JobBuilder.newJob(BAPJob.class).withIdentity("bapjob", "group1").build();

            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("bapjobtrigger", "group1")
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever())
                    .build();

            String key = "org.quartz.impl.StdSchedulerFactory.KEY";
            ServletContext servletContext = config.getServletContext();
            StdSchedulerFactory factory = (StdSchedulerFactory) servletContext.getAttribute(key);
            Scheduler scheduler = factory.getScheduler("MyQuartzScheduler");

            scheduler.start();
            scheduler.scheduleJob(job, trigger);

        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

在Tomcat服务器上启动应用程序后,我得到以下输出:

EXECUTION STARTING ...
EXECUTION STARTING ...
EXECUTION STARTING ...

谢谢你们!

2 个答案:

答案 0 :(得分:0)

  

这份工作不会叫它。

输出表明您的作业正在被调用。添加try..catch以捕获加载MailService类的任何错误:

try {
    MailService.test();
}
catch (Exception e) {
    e.printStackTrace();
}

答案 1 :(得分:0)

我找到了解决方案,我将其留在这里以防万一。

由于try catch只捕获异常,我需要捕获"错误"同样,我抓住了Throwable,它向我展示了一条之前未见过的消息错误。

所以我改变了我的工作如下:

public class BAPJob implements Job {

    public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("EXECUTION STARTING ...");

        try {
            InternetAddress.parse("to-email@gmail.com");
        } catch (Throwable t) {
            t.printStackTrace();
        }

        System.out.println("EXECUTION ENDING");
    }

}