我正在使用Quartz Scheduler v1.8.3并集成到Apache Tomcat v6.0.10中,因此调度程序为initialized from within servlet container。还从Apache Tomcat中添加/调度作业到调度程序。
我正在设计一个JSP Web前端页面(quartzAdmin.jsp),我只想查看调度程序信息,如meta-data值,所有作业详细信息及其触发器,当前正在执行的作业等。< / p>
我的问题是,为了获得调度程序的句柄,建议使用以下两个选项之一:
选项1:通过直接调用schedulerFactory.getScheduler()来获取句柄
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
选项2:通过实施单例模式获取处理
public class Quartz {
private Quartz() {
}
private static Scheduler scheduler = null;
public static Scheduler getScheduler() {
if(scheduler == null) {
SchedulerFactory sf = new StdSchedulerFactory();
scheduler = sf.getScheduler();
}
return scheduler;
}
}
然后在我的quartzAdmin.jsp中,只需调用 Quartz.getScheduler()就会返回调度程序的句柄。
答案 0 :(得分:0)
这里描述的是单例模式,单例初始化不是线程安全的。
我建议不要在这里使用单身,而是将Quartz
的引用添加到ServletContext
,可能会在ServletContextListener
中初始化。
<强>的web.xml 强>
<listener>
<listener-class>my.package.MyServletContextListener</listener-class>
</listener>
<强> MyServletContextListener.java 强>
package my.package;
public class MyServletContextListener implements ServletContextListener
{
@Override
public final void contextInitialized (
final ServletContextEvent event
)
{
final ServletContext servlet_ctx = event.getServletContext( );
Quartz quartz = new Quartz( );
servlet_ctx.addAttribute( Quartz.ATTRIBUTE_NAME, quartz );
}
@Override
public void contextDestroyed (
final ServletContextEvent event
)
{
final ServletContext servlet_ctx = event.getServletContext( );
Quartz.fromContext( servlet_ctx ).shutdown( );
servlet_ctx.removeAttribute( Quartz.ATTRIBUTE_NAME );
}
}
<强> Quartz.java 强>
public final static String ATTRIBUTE_NAME = Quartz.class.getName( );
public Quartz( )
{
...
}
public static Quartz fromContext( final ServletContext ctx )
{
return ctx.getAttribute( ATTRIBUTE_NAME );
}
public void shutdown( )
{
...
}
答案 1 :(得分:0)
我认为这两个选项的作用是创建 new 计划程序,而不是在web.xml
中获取您配置的计划程序。
目前我这样做(类似于选项1):
...configure a QuartzInitializerListener for my webapp... // my servlet's init() public void init(ServletConfig config) throws ServletException { ... SchedulerFactory factory = (SchedulerFactory) config.getServletContext().getAttribute( QuartzInitializerListener.QUARTZ_FACTORY_KEY ); Scheduler factory.getScheduler(); ... }