2010-09-08 3 views
0

J'utilise Quartz Scheduler v1.8.3 et est intégré dans Apache Tomcat v6.0.10, et par conséquent le planificateur est initialized from within servlet container. Les tâches sont également ajoutées/planifiées au planificateur depuis Apache Tomcat.Quelle est la méthode recommandée en tant que client pour gérer le planificateur?

Je suis la conception d'une page d'extrémité avant Web JSP (quartzAdmin.jsp) d'où je veux seulement voir les informations planificateur comme meta-data valeurs, tous les détails du travail ainsi que ses déclencheurs, d'exécution actuellement des emplois, etc.

ma question est, afin d'obtenir une poignée au planificateur, dont l'un des 2 ci-dessous option est recommandée:

Option 1: obtenir poignée en appelant directement schedulerFactory.getScheduler()

SchedulerFactory sf = new StdSchedulerFactory(); 
Scheduler scheduler = sf.getScheduler(); 

Option 2: Obtenir la poignée en mettant en place un singleton

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; 
    } 
} 

Puis dans mon quartzAdmin.jsp, juste un appel Quartz.getScheduler() renverrait une poignée au programmateur.

+0

Une question connexe à l'initialisation du quartz: http://stackoverflow.com/questions/3257074/whats-the-best-way-to -initalize-quartz – Gnanam

Répondre

0

Ce que vous décrivez ici est un modèle singleton, et votre initialisation singleton n'est pas sûre pour les threads.

Je recommande de ne pas utiliser singleton ici, mais d'ajouter à la place une référence à Quartz à ServletContext, en l'initialisant peut-être en 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() 
{ 
    ... 
} 
+0

En supposant que je ne manipule quoi que ce soit avec le planificateur en dehors de l'obtention d'informations relatives au planificateur, est-ce que cela devrait être rendu sûr pour les threads? J'espère que vous vouliez dire "pas thread-safe" dans ce contexte, ai-je raison? De plus, je ne suis pas capable de comprendre clairement votre recommandation mentionnée. Pouvez-vous expliquer avec un échantillon de code simple? – Gnanam

+1

@Gnanam. Si vous avez l'intention d'appeler votre méthode originale getScheduler() directement à partir de JSP (non recommandé), elle sera certainement appelée à partir de plusieurs threads. Vérifiez ce message pour la bonne façon d'initialiser singleton: http://stackoverflow.com/questions/3635396/pattern-for-lazy-thread-safe-singleton-instantiation-in-java/3635619#3635619 –

0

Je pense que les deux options créent un nouveau Scheduler, n'obtenant pas celui que vous avez configuré dans web.xml.

Je suis actuellement en train de faire cela (semblable à l'option 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(); 
    ... 
} 
+1

Non, je reçois un handle vers le planificateur qui a été initialisé auparavant à partir de 'web.xml'. Je peux le vérifier en utilisant 'scheduler.getMetaData(). getSummary() 'et vérifiez cette ligne' Exécution depuis: xxxxx' – Gnanam

+0

Je crois que cela est déjà pris en charge par Quartz scheduler lui-même. – Gnanam

+1

Eh bien, alors il n'y a pas besoin d'utiliser un singleton car Quartz s'en occupe. Utilisez simplement l'option 1. – gpeche

Questions connexes