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");
}
}
如标题所述,我正在尝试使用 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");
}
}