Каков рекомендуемый способ для клиента получить доступ к планировщику? - PullRequest
0 голосов
/ 08 сентября 2010

Я использую Quartz Scheduler v1.8.3 и интегрирован в Apache Tomcat v6.0.10, и, следовательно, планировщик инициализируется из контейнера сервлета .Задания также добавляются / планируются в планировщик из Apache Tomcat.

Я разрабатываю веб-интерфейс JSP (quartzAdmin.jsp), из которого я хочу видеть только информацию планировщика, такую ​​как метаданные значения, всю информацию о задании вместе с его триггерами,выполняемые в данный момент задания и т. д.

У меня вопрос, чтобы получить дескриптор для планировщика, какой из указанных ниже двух вариантов рекомендуется:

Опция 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 голосов
/ 08 сентября 2010

Я думаю, что обе опции создают планировщик новый , а не тот, который вы настроили в 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();
    ...
}
0 голосов
/ 08 сентября 2010

То, что вы описываете здесь, представляет собой шаблон синглтона, и ваша инициализация синглтона не является поточно-ориентированной.

Я бы рекомендовал не использовать здесь синглтон, а вместо этого добавить ссылку на 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( )
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...