我正在运行此quartz-2.1.0\examples\src\main\java\org\quartz\examples\example3
示例代码,它运行得很好,但是如果我将main
中的CronTriggerExample.java
代码移动到junit测试类,则该作业不会运行。
以下是石英示例代码(我为了简化而截断它们,您可以从quartz网站获取完整代码)。
SimpleJob.java:
public class SimpleJob implements Job {
private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey jobKey = context.getJobDetail().getKey();
_log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
}
}
CronTriggerExample.java:
public class CronTriggerExample {
public void run() throws Exception {
Logger log = LoggerFactory.getLogger(CronTriggerExample.class);
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
JobDetail job = newJob(SimpleJob.class)
.withIdentity("job1", "group1")
.build();
CronTrigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(cronSchedule("0/3 * * * * ?"))
.build();
Date ft = sched.scheduleJob(job, trigger);
log.info(job.getKey() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
sched.start();
}
public static void main(String[] args) throws Exception {
CronTriggerExample example = new CronTriggerExample();
example.run();
}
}
上面的代码运行良好,如果我将main
方法中的两行代码移动到junit测试类(junit4),如下所示:
public class Test1 {
@Test
public void run() throws Exception {
CronTriggerExample example = new CronTriggerExample();
example.run();
}
}
作业没有运行。
我很困惑为什么相同的代码无法在junit中运行?
答案 0 :(得分:0)
要自己查看问题,我建议在像Eclipse这样的IDE中以调试模式运行这两段不同的代码。
当您在main
中运行这两行时,即使main
终止,您创建的Quartz Scheduler也会继续运行。
当你在JUnit中运行这两行时,当所有单元测试都终止时,JUnit框架会终止所有剩余的线程。
为了让时间到Quartz来触发你的Job,你应该用下面的方法改变你的JUnit测试
public class Test1 {
@Test
public void run() throws Exception {
CronTriggerExample example = new CronTriggerExample();
example.run();
Thread.sleep(240000); // Sleep 4 minutes (4*60*1.000 = 240.000)
}
}
答案 1 :(得分:0)
当Quartz线程运行时,你需要阻塞主线程,正如@Kraiss所说,测试几乎会立即死亡。要在测试中执行任何有用的操作,例如从Quartz创建的线程执行断言,您可以使用类似ConcurrentUnit的帮助。