Как использовать Quartz с QuartzInitializerListener? - PullRequest
7 голосов
/ 14 апреля 2011

Мне сложно понять, как использовать Quartz с QuartzInitializerListener.

Сначала я объявляю этого слушателя в дескрипторе развертывания.Но как добавить свою работу?Взглянув на реализацию QuartzInitializerListener , я вижу, что она создает SchedulerFactory и Scheduler, но я не вижу способа добавить задания.Фабрика получает файл конфигурации , но, опять же, там нет ничего, связанного с заданиями.

Я нашел только очень простые примеры из моих поисков, все об инстанцировании всего в основном методе.

Может кто-нибудь указать мне более реальный пример?Я использую JBoss 5, если это имеет значение.Спасибо.

Ответы [ 2 ]

5 голосов
/ 07 июня 2014

Привет Вот ответ на ваш запрос:

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 будет работать по порядку. На данный момент у нас будет готовый планировщик фабрики. Этот слушатель также запустит планировщик, если соответствующее свойство «кварц: запуск при загрузке» либо не указано, либо указано как true.

3) Напишите свой кварцевый слушатель:

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 будет выполнен. Это означает, что у нас есть готовая фабрика планировщиков с нами и запущенный планировщик. Так что вам нужно только добавить работу в планировщик. Как вы можете видеть, метод contextDestroyed пуст, так как работа по отключению планировщика будет выполняться программой Quartz API.

5 голосов
/ 14 апреля 2011

Все описано в исходном коде Javadoc, который вы цитируете:

Экземпляр StdSchedulerFactory сохраняется в ServletContext. Вы можете получить доступ на фабрику из экземпляра ServletContext, как это:

StdSchedulerFactory factory = (StdSchedulerFactory) ctx
       .getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);

EDIT : Это означает, что когда вы используете этот слушатель, вы можете получить SchedulerFactory внутри каждого сервлета / контроллера Spring MVC / ..., запустив:

StdSchedulerFactory factory = (StdSchedulerFactory)httpServletRequest
    .getServletContext()
    .getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);

Обратите внимание, что прослушиватели контекста гарантированно будут выполняться перед использованием любого сервлета для обработки входящих запросов. Это означает, что планировщик всегда будет правильно инициализирован до его использования.


Резюме обсуждения в комментариях ниже, обсуждение на самом деле отвечает на заданный вопрос: Если вы хотите добавить задания при запуске приложения, напишите еще один прослушиватель (аналогичный тому, который предоставляет Quartz), найдите StdSchedulerFactory (ServletContext легко доступен) и сделайте то, что вы хотите. Слушатели гарантированно будут выполняться в том же порядке, в каком они объявлены в web.xml, поэтому поместите ваш слушатель после Quartz one.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...