2011-12-16 2 views
2

J'utilise le planificateur de quartz dans l'application de Web de gwt. Ma structure d'application est comme ci-dessous.Planificateur de quartz en ne fonctionnant pas en guerre

J'ai deux project.One est gwt projet d'application web client (pour la partie ui) & autre est projet java pour l'appel côté serveur. (Pour l'interaction de base de données). Dans le projet client, je mets un projet serveur pour référence. Je crée une guerre du client et ajoute un pot de projet de serveur au dossier de guerre.

Maintenant, j'ai utilisé le planificateur côté serveur pour que certaines tâches se terminent automatiquement. Tout en l'exécutant localement (sans guerre), le planificateur fonctionnait correctement.

Mais lors de l'exécution de la guerre au niveau du serveur JBoss, le planificateur n'est pas en cours d'exécution.

Mon code all scheduler et Quartz.jar est côté serveur. Il n'y a aucune référence de Quartz dans le projet côté client. Est-ce le problème ???

Voici mon code pour planificateur

public class QuartzJob implements Job { 

public void execute(JobExecutionContext jobExecutionContext) 
     throws JobExecutionException { 
    JobDataMap map = jobExecutionContext.getJobDetail().getJobDataMap(); 
    ActivityTransactionSettingsMap map2 = (ActivityTransactionSettingsMap) map 
      .get("task"); 

    if (map2.getAutoCompleteDate() != null) { 
     WorkFlowFacade facade = new WorkFlowFacade(); 
     facade.completeAutoCompleteTask(map2); 
     Scheduler scheduler=(Scheduler) map.get("scheduler"); 
     try { 
      scheduler.shutdown(); 
     } catch (SchedulerException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 
    scheduler.start(); 
    JobDataMap map2 = new JobDataMap(); 
    map2.put("task", actsMap); 
    map2.put("scheduler", scheduler); 
    JobDetail job = newJob(QuartzJob.class).withIdentity("job"+String.valueOf(actsMap.getId())) 
      .usingJobData(map2).build(); 
    Trigger trigger = newTrigger().withIdentity("trigger"+String.valueOf(actsMap.getId())) 
      .startAt(actsMap.getAutoCompleteDate()).build(); 
    scheduler.scheduleJob(job, trigger); 

Ou dois-je changer mon planificateur projet lié au côté client seulement ?? Je ne comprends pas comment résoudre ce problème. S'il vous plaît aidez-moi

+1

Le planificateur n'a rien à voir avec votre code GWT aussi loin que je peux le voir. Quel est le déclencheur pour le planificateur? –

+0

Voici le déclencheur. Trigger trigger = newTrigger() .withIdentity ("trigger") .startAt (tomaroDate) .build(); –

+1

Je ne suis pas sûr de vous avoir ici. Devrait-il commencer à fonctionner continuellement dès le lendemain? Est-ce ce dont vous avez besoin ? –

Répondre

2

Pour que le planificateur fonctionne, il devrait y avoir quelque chose pour le démarrer. Je ne sais pas comment le processus se passe mais vous pouvez écrire ce planificateur dans un servlet

public class MySchedulerServlet extends GenericServlet { 

private static final long serialVersionUID = 1477091380142883153L; 

/** 
* Constant to represent property for the cron expression. 
*/ 
private static final String CRON_EXPRESSION = "0 0 0 ? * SUN"; 

public void init(ServletConfig servletConfig) throws ServletException { 

    super.init(servletConfig); 

    // The Quartz Scheduler 
    Scheduler scheduler = null; 

    try { 

     // Initiate a Schedule Factory 
     SchedulerFactory schedulerFactory = new StdSchedulerFactory(); 
     // Retrieve a scheduler from schedule factory 
     scheduler = schedulerFactory.getScheduler(); 
     // Initiate JobDetail with job name, job group and 
     // executable job class 
     JobDetail jobDetail = new JobDetail("RetryJob", "RetryGroup", QuartzJob.class); 
     // Initiate CronTrigger with its name and group name 
     CronTrigger cronTrigger = new CronTrigger("cronTrigger", 
       "triggerGroup"); 
     // setup CronExpression 
     CronExpression cexp = new CronExpression(CRON_EXPRESSION); 
     // Assign the CronExpression to CronTrigger 
     cronTrigger.setCronExpression(cexp); 
     // schedule a job with JobDetail and Trigger 
     scheduler.scheduleJob(jobDetail, cronTrigger); 

     // start the scheduler 
     scheduler.start(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

public void service(ServletRequest serveletRequest, 
     ServletResponse servletResponse) throws ServletException, IOException { 

} 

} 

et dans votre web.xml sceduler de charge au démarrage. Cela fonctionne pour moi.

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

     <servlet-name>MySchedulerServlet </servlet-name> 
     <servlet-class>com.servlet.MySchedulerServlet </servlet-class> 
    <load-on-startup>2</load-on-startup> 
0

J'ai utilisé le fil dans ce cas.

public class AutoCompleteTaskThread extends Thread { 

private ActivityTransactionSettingsMap taskMap; 

public AutoCompleteTaskThread(ActivityTransactionSettingsMap map) { 
    this.taskMap = map; 
} 
@Override 
public void run() { 
    try { 
     new AutoCompleteTaskScheduler().ScheduleJob(taskMap); 
    } catch (Exception e) {   
     e.printStackTrace(); 
    } 
} 

}

Comme ci-dessous et dans la machine locale, il travaille fine.but pour le serveur jboss il ne fonctionne pas.

+0

Encore une fois la question, Qui appelle la méthode de démarrage du fil? –

0

J'ai utilisé une instance de la classe AutoCompleteTaskThread et j'ai appelé la méthode start sur ceci.

private void addAutoCompleteTask(ActivityTransactionSettingsMap newTask) { 
    AutoCompleteTaskThread thread = new AutoCompleteTaskThread(newTask); 
    thread.start(); 
} 

Ici, j'ai commencé un thread pour toute nouvelle tâche pour laquelle je veux démarrer un nouveau thread.

Questions connexes