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

Quartz Job won't execute method containing an exception (try/catch or throws)

如标题所述,我正在尝试使用 Quartz 安排定期作业来发送电子邮件。 一个基本的作业测试工作完美(一些 hello world 打印等),但是一旦我调用一个具有 try/catch 子句或抛出异常的方法,作业就不会调用它。 您会在下面找到我负责作业处理的不同代码片段。

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 : class 包含我要调用的方法

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

谢谢大家!

the job won't call it.

输出表明正在调用您的作业。添加 try..catch 以捕获加载 MailService class:

的任何错误
try {
    MailService.test();
}
catch (Exception e) {
    e.printStackTrace();
}

我找到了解决方案,我会把它留在这里以防万一。

由于 try catch 只捕获异常,我还需要捕获 "errors",所以我捕获了 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");
    }

}