2013-08-27 5 views
1

Я запускаю простую кварцевую работу в основном классе, которая запускается каждые 30 секунд.Как остановить/прервать работу планировщика кварца вручную

public class Start { 
public static void main(String[] args) throws Exception {  
     SchedulerFactory sf = new StdSchedulerFactory(); 
     Scheduler sched = sf.getScheduler(); 
     JobDetail job = newJob(MyJob.class).withIdentity("myJob","XXX").build(); 
    Trigger trigger = TriggerBuilder.newTrigger() 
     .withSchedule(
      SimpleScheduleBuilder.simpleSchedule() 
       .withIntervalInSeconds(30) 
      .repeatForever()) 
           .build(); 
    sched.scheduleJob(job, trigger); 
    sched.start(); 
    } 
} 

Здесь я реализую InterruptableJob как

public class MyJob implements InterruptableJob { 

private volatile boolean isJobInterrupted = false; 

private JobKey jobKey = null; 

private volatile Thread thisThread; 

public MyJob() { 
} 

@Override 
public void interrupt() throws UnableToInterruptJobException { 
    // TODO Auto-generated method stub 
    System.err.println("calling interrupt:"+thisThread+"==>"+jobKey); 
    isJobInterrupted = true; 
    if (thisThread != null) { 
     // this call causes the ClosedByInterruptException to happen 
     thisThread.interrupt(); 
    } 

} 

@Override 
public void execute(JobExecutionContext context) throws JobExecutionException { 
    // TODO Auto-generated method stub 
    thisThread = Thread.currentThread(); 

    jobKey = context.getJobDetail().getKey(); 

    System.err.println("calling execute:"+thisThread+"==>"+jobKey); 
} 
} 

Теперь я пытался остановить работу с использованием другого основного класса, как всячески не повезло

public class Stop { 
public static void main(String[] args) throws Exception { 

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

     // get a "nice round" time a few seconds in the future... 
     Date startTime = nextGivenSecondDate(null, 1); 

     JobDetail job = newJob(MyJob.class).withIdentity("myJob", "XXX").build(); 

     Trigger trigger = TriggerBuilder.newTrigger() 
     .withSchedule(
       SimpleScheduleBuilder.simpleSchedule() 
        .withIntervalInSeconds(30) 
       .repeatForever()) 
            .build(); 

     sched.scheduleJob(job, trigger); 

     sched.start(); 


      try { 
        // if you want to see the job to finish successfully, sleep for about 40 seconds 
       Thread.sleep(60000) ; 
        // tell the scheduler to interrupt our job 
        sched.interrupt(job.getKey()); 
        Thread.sleep(3 * 1000L); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       System.err.println("------- Shutting Down --------"); 

       TriggerKey tk=TriggerKey.triggerKey("myJob","group1"); 
       System.err.println("tk"+tk+":"+job.getKey()); 
       sched.unscheduleJob(tk); 
       sched.interrupt(job.getKey()); 
       sched.interrupt("myJob"); 
       sched.deleteJob(job.getKey()); 
       sched.shutdown(); 
       System.err.println("------- Shutting Down "); 

       sched.shutdown(false); 

       System.err.println("------- Shutdown Complete "); 

      System.err.println("------- Shutdown Complete "); 

    } 
} 

Может кто-нибудь пожалуйста, скажите мне правильный способ остановить работу? Большое спасибо.

+0

открыть JMX с вашей конфигурацией кварца, и я считаю, что в MBean есть ручные операции, чтобы делать то, что вы просите. – 75inchpianist

ответ

4

This question, кажется, ответить на точную проблему вы описываете:

Вы должны написать свою работу в качестве реализации InterruptableJob. Для того, чтобы прервать эту работу, вам нужно обращаться к Scheduler и вызовите interrupt(jobKey<<job name & job group>>)

Как за InterruptableJobdocumentation:

интерфейс будет осуществляться Джобсом, которые обеспечивают механизм для того, что их выполнение прерывается. Это не требование для рабочих мест для реализации этого интерфейса - на самом деле, для большинства людей, ни одна из их работ не будет.

Прерывание задания очень похоже на в концепции и вызов нормальному прерыванию потока в Java.

Средство фактического прерывания задания должно быть реализовано в самом задании (метод interrupt() этого интерфейса является просто средством, с помощью которого планировщик сообщает Job, что запрос был сделан для его прерывания) , Механизм, который ваши задания используют для прерывания, может различаться между реализациями. Однако принципиальная идея в любой реализации должна заключаться в том, чтобы орган выполнения задания (..) периодически проверял некоторый флаг, чтобы узнать, запрошено ли прерывание, и если флаг установлен, каким-то образом прервать выполнение остальных работа работы.

Emphasis mine. Это аналогичный, но не то же самое. Вы не должны использовать Threads (но действительно можете, если это то, что делает ваш Job ...).

Пример прерывания задания можно найти в источнике java для класса org.quartz.examples.DumbInterruptableJob. Легально использовать некоторую комбинацию синхронизации wait() и notify() в interrupt() и execute (..), чтобы иметь блок метода interrupt() до тех пор, пока команда execute (..) не сообщит, что она заметила набор флаг.

Поэтому я рекомендую reading the documentation и проверять примеры в full download.

+0

Я сделал это точно так, как это ... реализовал InterruptableJob и вызывающее прерывание (jobKey << название работы и группа заданий >>), но метод прерывания никогда не будет вызван, а работа также не остановлена ​​...Пожалуйста, посмотрите на вышеупомянутый подробный код – MAS

+0

Было бы лучше, если бы вы предоставили весь набор кода, поскольку вы перерезали биты, и поэтому сложно определить, что происходит. –

+1

Я отредактировал с полным кодом ... пожалуйста, загляните в Stop.java .... где я пробовал много способов с несколькими комбинациями, чтобы справиться с работой, но все равно не повезло. Большое спасибо за ваше время и ответ. – MAS

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