作为客户端推荐调度程序的推荐方法是什么?

时间:2010-09-08 13:43:05

标签: java singleton quartz-scheduler

我正在使用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()就会返回调度程序的句柄。

2 个答案:

答案 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();
    ...
}