2014-10-15 2 views
1

Я столкнулся со всеми примерами кварца 2.x, но я не получаю однозначного примера того, как инициализировать планировщик кварца с помощью Quartz Initializer Servlet.кварцевый планировщик с использованием QuartzInitializerServlet

Каждый, кто объявляет сервлет и пишет что-то в файле свойств. Но никто не говорит, как использовать этот сервлет для кварцевого инициализатора.

Как настроить мой планировщик и когда вызывать метод запуска планировщика, я задаю этот вопрос, особенно потому, что я читал в некоторых блогах, что, хотя мы не вызывали метод start явно, сервлет позаботится о вызове Это!! Это правда? Может ли кто-нибудь ясно объяснить пример, взяв образец задания, а не скопировать вставку quartz.properties из Google

Потому что есть так много неотвеченных вопросов по этой теме?

Извините, если я записал что-то не так.

ответ

1

hi quartz - это потрясающая библиотека, но есть очень мало примеров того, как реализовать на веб-проекте. Большинство примеров относятся к весне, но они слишком сложны. Поэтому после долгих проб и ошибок я наконец смог реализовать кварцевый планировщик в мое веб-приложение. Я пробовал Quartz RamJobStore, XmlJob (сохранение заданий и триггеров в xml-файле) и Постоянное задание (сохранение задания и триггера в базе данных mysql). Самое лучшее, что касается кварца для этих трех разных подходов, я не должен делать ничего лишнего. Я имею в виду, что логика создания задания и триггера остается неизменной для всех этих трех подходов, однако нам просто нужно настроить наши файлы свойств, чтобы они работали.

Так что я реализовал кварц в веб-приложении Java. Я использую net-beans ide.Below - это код, который поможет вам начать. В этом примере я использую jdbcjobstore, что означает, что я создаю задание и запускаю и сохраняю их в MySQL, так что даже если моя система перезапустит задание и триггер будет доступна как они сохраняются в постоянном хранилище (MySQL).

1> Сначала я создал простой веб-проект java в net-beans.

2> Добавить все банки в папку lib из пакета "quartz-2.2.1", который я загрузил с веб-сайта там, где находится ваш проект net-beans и соединитель MySQL.

3> Настроить log4j: чтобы сделать это создать log4j.properties файл и добавьте следующие строки:

log4j.rootLogger=INFO, stdout 
log4j.logger.org.quartz=DEBUG 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 

** Поместите этот файл log4j.properties в:

NetBeansProjects 
    ->QurtzWebApp 
     ->src 
      ->java 
       ->MySomePackage 
        ->HelloWorldJob.java 
       log4j.properties 
       quartz.properties 

4> Создать HelloWorldJob класс, щелкнув правой кнопкой мыши по source packages в дереве проектной иерархии в окне проекта net-beans.

Моего HelloWorldJob Conatains класс код ниже:

package MySomePackage; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.net.URL; 
import java.util.Date; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 

public class HelloWorldJob implements Job { 
@Override 
public void execute(JobExecutionContext context)throws JobExecutionException { 
     try 
     { 
      String content = "Quartz 2 example @ ["+new Date()+"]"; 
      File file = new File("C:\\DemoMsg.txt"); 

      if (!file.exists()) { 
       file.createNewFile(); 
      } 

      FileWriter fw = new FileWriter(file.getAbsoluteFile(),true); 
      BufferedWriter bw = new BufferedWriter(fw); 
      bw.write(content); 
      bw.close(); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("ex = "+ex.getMessage()); 
     } 
    } 
} 

Над кода просто создать DemoMsg текстовый файл в диске, если уже не созданы и написать сообщение определить в переменном контенте на определенном триггере interval.for например, если я создал триггер для выполнения через каждые 5 минут, вы должны увидеть это сообщение через каждые 5 минут в текстовом файле. Я специально добавил значение даты, чтобы вы могли проверить, записывается ли файл в соответствии с расписанием триггера в этом случае через каждые 5 минут.

5> Создать quartz.properties файл в месте указать на 3 шага и писать ниже код в нем:

org.quartz.scheduler.instanceName = MY_SCHEDULER 
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 4 
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true 

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.dataSource = MyDataStore 
org.quartz.jobStore.tablePrefix = qrtz_ 
org.quartz.jobStore.misfireThreshold = 60000 
org.quartz.jobStore.isClustered = false 

org.quartz.dataSource.MailDataStore.driver = com.mysql.jdbc.Driver 
org.quartz.dataSource.MailDataStore.URL = jdbc:mysql://localhost:3306/quartz 
org.quartz.dataSource.MailDataStore.user = yourdbusername 
org.quartz.dataSource.MailDataStore.password = yourdbpassword 
org.quartz.dataSource.MailDataStore.maxConnections = 20 

Создание базы данных в MySQL кварцевое и создать кварцевый tables.Code для создания таблицы можно найти в quartz-2.2.1\docs\dbTables\tables_mysql.sql каталоге. Просто импортируйте этот файл sql.

5> создать файл web.xml и добавить follwing запись:

<listener> 
<listener-class> 
org.quartz.ee.servlet.QuartzInitializerListener 
</listener-class> 
</listener> 

6> Затем создал простую страницу JSP с помощью таблиц и форм, которые только принимают JobId JobName CRO выражение от пользователя и опубликовать его на другую страницу.

7> Код для Jsp файла, в котором детали формы размещены следующим образом:

type=request.getParameter("type"); 

    if(type.equals("createSchedule")) 
    { 
     String jobName="",jobDesc="",jobData="",cronVal=""; 

     jobName=request.getParameter("txtJobName"); 
     jobDesc=request.getParameter("txtJobDesc"); 
     jobData=request.getParameter("txtJobData"); 
     cronVal=request.getParameter("txtCronExrp"); 

     SchedulerFactory sf = new StdSchedulerFactory(); 
     Scheduler sched = sf.getScheduler(); 
     System.out.println("------- Initialization Complete --------"); 

     System.out.println("------- Intitalizing Jobs ----------------"); 

     JobKey jobKey = new JobKey(""+jobName, "JobGroupName"); 
     JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity(jobKey).build(); 
     jobDetail.getJobDataMap().put("jobData",""+jobData); 
     jobDetail.getJobDataMap().put("jobDesc",""+jobDesc); 

     System.out.println("------- Intitalizing Triggers ----------------"); 
     CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(""+jobName+"_"+"Trigger", "TriggerGroup").withSchedule(CronScheduleBuilder.cronSchedule(""+cronVal)).build(); 


     System.out.println("------- Starting Scheduler ----------------"); 

     JobKey jk=new JobKey(""+jobName); 
     TriggerKey tk=new TriggerKey (""+jobName+"_"+"Trigger"); 
     JobDetail Searchjob = sched.getJobDetail(jk); 
     System.out.println("Job found = " + Searchjob); 

     //Check if job already exist 
     if (Searchjob == null) // job not exist 
     { 
      Date ft = sched.scheduleJob(jobDetail, trigger); 
      System.out.println(sched.getSchedulerName()); 
      System.out.println(jobDetail.getKey() + " has been scheduled to run at: " + ft+ " and repeat based on expression: " + trigger.getCronExpression()); 

     } 
     else //job exist 
     { 
      sched.rescheduleJob(tk, trigger); 
     } 

     sched.start(); 

     %>Schedule Created Successfully !<% 
    } 

8> я передать параметр, чтобы проверить, следует ли я создавать, редактировать или удалять задания. для издания и удаления задания вам нужен идентификатор работы, который определяется при создании задания.

Я знаю, что ответ слишком длинный, но я надеюсь, что он поможет вам в вашем сценарии.

0

QuartzInitializerServlet запустит планировщик для вас и поместит StdSchedulerFactory в ServletContext.

Чтобы получить уже начал планировщик:

ServletContext ctx = request.getServletContext(); 
StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY); 
Scheduler scheduler = factory.getScheduler(); 

где "запрос" является текущим HTTPServletRequest.

Планировщик может быть настроен с помощью файла свойств в пути к классам или в WEB-INF (я не тестировал это). Имя файла конфигурации должно быть указано в web.xml в качестве параметра init-param для QuartzInitializerServlet:

<servlet> 
     <servlet-name>QuartzInitializer</servlet-name> 
     <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> 
     <init-param> 
     <param-name>config-file</param-name> 
     <param-value>quartz.properties</param-value> 
     </init-param> 
     <init-param> 
     <param-name>shutdown-on-unload</param-name> 
     <param-value>true</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
</servlet>