我无法理解如何将Quartz与QuartzInitializerListener
一起使用。
首先,我在部署描述符中声明该侦听器。但是,如何添加我的工作呢?看一下QuartzInitializerListener implementation,我看到它会创建SchedulerFactory
和Scheduler
,但我看不到任何添加作业的方法。工厂收到configuration file,但再没有与那里的工作有关。
我只在搜索中找到了很简单的例子,都是关于在main方法中实例化所有内容。
有人能指出一个更实际的例子吗?如果重要的话,我正在使用JBoss 5。感谢。
答案 0 :(得分:5)
您引用的source code Javadoc中描述了所有内容:
StdSchedulerFactory实例存储在ServletContext中。你可以获得访问权限 从这样的ServletContext实例到工厂:
StdSchedulerFactory factory = (StdSchedulerFactory) ctx
.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
编辑:这意味着当您使用此侦听器时,您可以通过运行在每个servlet / Spring MVC控制器/ ...中获取SchedulerFactory
:
StdSchedulerFactory factory = (StdSchedulerFactory)httpServletRequest
.getServletContext()
.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
请注意,保证在使用任何servlet处理传入请求之前执行上下文侦听器。这意味着调度程序在使用之前将始终正确初始化。
以下评论中的讨论摘要,讨论实际上回答了被问到的问题:
如果要在应用程序启动时添加作业,请编写另一个侦听器(类似于Quartz提供的侦听器),查找StdSchedulerFactory(ServletContext很容易获得)并执行您想要的操作。保证监听器的执行顺序与web.xml中声明的顺序相同,因此将监听器放在Quartz之后。
答案 1 :(得分:3)
您好以下是您的疑问的答案:
1)第1步:写作业:
package com.hitesh.quartz.test;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class QuartzJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("Hello");
}
}
2)编写web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>TestWebBasedQuartz</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:start-on-load</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>
<listener>
<listener-class>com.hitesh.quartz.test.QuartzJobListener</listener-class>
</listener>
</web-app>
正如您所看到的,有两个听众。一个属于Quartz API,另一个属于您的API。第一个Quartz API监听器将按顺序执行。此刻我们将有现成的调度工厂。如果未指定相应的属性“quartz:start-on-load”或指定为true,则此侦听器也将启动调度程序。
3)编写Quartz Listener:
package com.hitesh.quartz.test;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
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.ee.servlet.QuartzInitializerListener;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzJobListener implements ServletContextListener {
private Scheduler scheduler;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
@Override
public void contextInitialized(ServletContextEvent ctx) {
JobDetail job = JobBuilder.newJob(QuartzJob.class)
.withIdentity("dummyJobName", "group1").build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("dummyTriggerName", "group1")
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1).repeatForever())
.build();
try{
scheduler = ((StdSchedulerFactory) ctx.getServletContext().getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY)).getScheduler();
scheduler.scheduleJob(job, trigger);
}catch(SchedulerException e){
}
}
}
此侦听器将在Quartz侦听器执行后执行。这意味着我们已经准备好了Scheduler Factory和一个启动调度程序。所以你只需要向调度程序添加作业。如您所见,contextDestroyed方法为空,因为调度程序关闭工作将由Quartz API schedluer执行。