正如标题所述,我正在尝试使用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 ...
谢谢你们!
答案 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");
}
}