Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Quartz, esempio pratico

Dopo l'articolo introduttivo, di settimana scorsa, passiamo a un esempio pratico: utilizziamo la libreria Quartz in un'applicazione Web per schedulare uno o più job
Dopo l'articolo introduttivo, di settimana scorsa, passiamo a un esempio pratico: utilizziamo la libreria Quartz in un'applicazione Web per schedulare uno o più job
Link copiato negli appunti

Settimana scorsa abbiamo introdotto i concetti principali di Quartz. Adesso vediamo come utilizzare la libreria in un'applicazione Web per schedulare uno o più job.

Prima di tutto occorre definire la Servlet di Quartz nel file web.xml.

<servlet>
  <servlet-name>QuartzInitializer</servlet-name>
  <servlet-class>
    org.quartz.ee.servlet.QuartzInitializerServlet
  </servlet-class>
  <init-param>
    <param-name>shutdown-on-unload</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>start-scheduler-on-load</param-name>
    <param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

La servlet QuartzInitializerServlet viene caricata all'avvio dell'applicazione e ha lo scopo di inizializzare l'ambiente. La Servlet legge, se presente, il file di configurazione quartz.properties, nel quale vengono definite tutte le proprietà dello scheduler.

Il nostro file di configurazione quartz.properties, non contiene tutte le properties disponibili e configurabili. Per semplicità abbiamo inserito soltanto alcune sezioni, ognuna delle quali, possiede le propietà principali.

########
#Scheduler configuration
########

org.quartz.scheduler.instanceName = Scheduler
org.quartz.scheduler.instanceId = 1
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false

########
#ThreadPool configuration
########
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3

########
#Store configuration
########
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

########
#Plugin configuration
########
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = ./quartz-jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true

  1. Configurazione dello Scheduler.
    • scheduler.instanceName - nome dello Scheduler.
    • scheduler.instanceId - id univoco dello Scheduler.
  2. Configurazione del pool di thread.
    • threadPool .class: classe che gestisce i thread lanciati dallo Scheduler. Naturalmente Quartz dispone di diverse classi, ognuna delle quali, possiede delle specifiche proprietà. Noi abbiamo utilizzato per semplicità la classe org.quartz.simpl.SimpleThreadPool.
    • threadPool.threadCount: numero massimo di trhead che possono essere avviati contemporaneamente dallo Scheduler.
  3. Configurazione dello store, ossia del deposito in cui quartz memorizza le proprie informazioni.
    • jobStore.class: classe che prende cura della memorizzazione dei dati. Anche in questo caso, Quart mette a disposizione diverse classi; nell'esempio utilizziamo la classe RAMJobStore che mantiene in memoria le informazioni.
  4. Configurazione del plugin JobInitializationPlugin, che permette di inizializzare l'ambiente e definire tutti i job che devono essere schedulati.
    • plugin.jobInitializer.class: classe che definisce il tipo di plugin.
    • plugin.jobInitializer.fileName: path del file di configurazione che contiene l'elenco dei job da schedulare.
    • plugin.jobInitializer.overWriteExistingJobs: abilita/disabilita la sovrascrittura dei job, eventualmente siano già stati precedentemente schedulati.
    • plugin.jobInitializer.failOnFileNotFound: abilita/disabilita la sospensione dell'esecuzione dell'applicazione, se il file di configurazione non viene trovato.

Il file quartz-jobs.xml nel quale sono definiti i job da schedulare è il seguente:

<?xml version="1.0" encoding="UTF-8"?>
<quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    overwrite-existing-jobs="true">
  <job>
    <job-detail>
      <name>htmlTestJob</name>
      <group>htmlGroup</group>
      <description>Html Test Job</description>
      <job-class>lucasantaniello.jobs.MyJob</job-class>
    </job-detail>
    <trigger>
      <cron>
       <name>htmlTestTrigger</name>
       <group>htmlTriggerGroup</group>
       <job-name>htmlTestJob</job-name>
       <job-group>htmlGroup</job-group>
        <!--sintassi analoga ai crontab, schedulazione ogni 5 secondi-->
       <cron-expression>*/5 * * * * ?</cron-expression>
      </cron>
    </trigger>
  </job>
</quartz>

In questo file definiamo il job htmlTestJob appartenente al gruppo htmlGroup che corrisponde alla classe lucasantaniello.jobs.MyJob. Il Job viene attivato dal Trigger htmlTestTrigger ogni 5 secondi.

La classe lucasantaniello.jobs.MyJob deve implementare la classe Job di Quartz.

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job{
  public void execute(JobExecutionContext jec) throws JobExecutionException{
    System.out.println("Ciao sono il processo " + jec.getJobDetail().getName() + "... sono stato eseguito");
  }
}

Ti consigliamo anche