2014-09-11 3 views
0

Я борюсь с триггерами кварца. Я создал службу, которая вызывается через выражение cron, но также и сама org.quartz.Job. Идея заключается в том, что после вызова службы я проверяю некоторые переменные и на основании этого решаю задерживать (или нет) исполнение услуги на 1 день; для этого я получаю DefaultScheduler, создаю новый org.quartz.JobDetail и org.quartz.SimpleTrigger и планирую их. Как вы можете догадаться, он не работает, новый триггер никогда не запускается.
Quartz SimpleTrigger не стреляет

public class MyService implements MyInterface, org.quartz.Job { 

    @Override 
    //method declared in MyInterface 
    public void generateFile() { 
     org.quartz.Scheduler scheduler; 
     try { 
      scheduler = org.quartz.impl.StdSchedulerFactory.getDefaultScheduler(); 
     } catch (SchedulerException e1) { 
      scheduler = null; 
     } 
     if (condition) { 
      //regular processing 
     } else { 
      try { 
        org.quartz.JobDetail jobDetail; 
        SimpleTrigger simpleTrigger; 
        String name = "jobName"; 
        if (scheduler != null && scheduler.isInStandbyMode()){ 
         jobDetail = new org.quartz.JobDetail(name, org.quartz.Scheduler.DEFAULT_GROUP, MyService.class); 
         jobDetail.getJobDataMap().put("myService", this);      
         Calendar c = Calendar.getInstance(); 
         int date = c.get(Calendar.DATE); 
         c.set(Calendar.DATE, date + 1); 
         simpleTrigger = new SimpleTrigger("simpleTrig", c.getTime()); 
         simpleTrigger.setJobName(name); 

         jobDetail.setDurability(true); 
         scheduler.addJob(jobDetail, true); 

         scheduler.scheduleJob(simpleTrigger); 
         //also tested with 
         //scheduler.scheduleJob(jobDetail, simpleTrigger); 
         //and same result 
         scheduler.start(); 
        } 
        else{ 
         scheduler.shutdown(); 
        } 
       } catch (java.text.ParseException e) { 
       } 
       catch (org.quartz.SchedulerException ex) { 
       } 
     } 
    } 

    @Override 
    public void execute(JobExecutionContext jobContext) throws JobExecutionException { 
     MyInterface jobParamLogService = (MyInterface)jobContext.getJobDetail().getJobDataMap().get("myService"); 
     jobParamLogService.generateFile(); 
    } 

Как я сказал, моя проблема заключается в том, что SimpleTrigger никогда не будет вызываться (в выключенном состоянии, конечно, я проверил, добавив несколько минут, а не в день), делает любой имеет любой совет о том, что происходит?
Любая помощь была бы действительно оценена.

+1

Первое, что вам нужно сделать, это правильно обрабатывать ваши исключения. Из-за проблемы вы не можете добавлять задание в планировщик. Либо регистрируйте трассировку сообщения/стека, либо что-то действительно важно –

+0

Привет @ChrisHinshaw, спасибо за ваш комментарий, код, который я вам показывал, - это просто упрощенная версия, я обрабатываю исключения, но никто не бросает – maxivis

+0

2 вещи здесь : 1) Почему вы просматриваете свой экземпляр службы таким сложным способом, что можете просто вызвать 'this.generateFile()' напрямую (исключение 'this.' - это одно и то же) 2) Почему вы используете статический вызов планировщика по умолчанию, когда вы можете получить доступ к фактическому планировщику непосредственно из JobExecutionContext, предоставленного вашей работе? Я предполагаю, что ваше состояние на самом деле ложно или вы получаете доступ к неправильному планировщику, и в конечном итоге ничего не происходит. –

ответ

0

Как предложил @GuillaumePolet, я попытался удалить условие isInStandByMode, но все еще не работал. Трюк состоял в том, чтобы заменить конструктор аргументами по умолчанию (пустым) и установить переменные с помощью методов setter.
Спасибо вам за помощь, с уважением

Смежные вопросы