2012-01-13 7 views
0

私は2つのプロセスを持っています:Quartzでトリガーの発射を延期することは可能ですか?

プロセス1 - runnableを実装し、永遠に実行できます。 プロセス2 - 固定された時間と分で起動します(私はQuartzで動作するジョブを作成しました)。

他のプロセスが実行中であることをプロセス1に警告するには、TriggerListenerを使用できますが、プロセス1がまだ何かをしている場合、どのように第2プロセスの実行を延期できますか?

例:2PMでトリガを起動する必要がありますが、プロセス1がアイドル状態でない場合は、2PM後にトリガする必要があります。

ここではいくつかのサンプルです:

ProcessForever.java

import static org.quartz.CronScheduleBuilder.dailyAtHourAndMinute; 
import static org.quartz.JobBuilder.newJob; 
import static org.quartz.TriggerBuilder.newTrigger; 

public class ProcessForever implements Runnable { 

    private boolean processTwoRunning; 
    private Scheduler scheduler; 
    private Trigger trgProcessTwo; 
    private String status; 

    public static final STATUS_PROCESS = "PROCESS"; 
    public static final STATUS_SLEEP = "SLEEP"; 

    private static Logger LOGGER = Logger.getLogger(ProcessForever.class.getName()); 

    public void init() throws SchedulerException { 
     SchedulerFactory fact = new StdSchedulerFactory(); 
     scheduler = fact.getScheduler(); 
    } 

    @Override 
    public void run() { 
     try { 
      scheduler.start(); 
      buildTrigger(); 
      while(true) { 
       //do something and then sleep for some time. 
       //the Quartz trigger should fire only in STATUS_SLEEP... 
       setStatus(STATUS_PROCESS);  
       try { Thread.sleep(120 * 1000); }catch(Exception e){} 
       setStatus(STATUS_SLEEP);   
      }catch(Exception e) { 
       e.printStackTrace(); 
      } 
} 

    private void buildTrigger() throws SchedulerException { 
    LOGGER.info("defineCargaDadosTrigger()"); 
    JobDetail dt = newJob(ProcessTwo.class) 
          .withIdentity("coleta","grpcoleta") 
          .build(); 

    trgProcessTwo = newTrigger().withIdentity( 
          new TriggerKey("triggerProcessTwo")) 
            .forJob(dt) 
            .startNow() 
            .withSchedule(dailyAtHourAndMinute(13,31)) 
            .build(); 
    KeyMatcher<TriggerKey> m = KeyMatcher.keyEquals(trgProcessTwo.getKey()); 
    scheduler.scheduleJob(dt, trgProcessTwo); 
    //this will notice the process 1 that the trigger is running... 
      //scheduler.getListenerManager().addTriggerListener(someclass, m); 
} 

    //getters & setters ommited... 

} 

ProcessTwo.java

import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
/** 
    ProcessTwo cannot run concurrent with ProcessForever... 
    */ 
public ProcessTwo implements Job { 
     @Override 
     public void execute(JobExecutionContext arg0) throws JobExecutionException { 
      System.out.println("Doing something..."); 
      try { Thread.sleep(10000); } catch(InterruptedException i){} 
      System.out.println("Stop doing something..."); 
     } 
} 

答えて

1

クォーツではかなり一般的な質問です。ここにいくつかのヒントがあります。FAQ

+0

よくある質問です。私はJobDataMapオプションを使って解決しました。ありがとう! –

関連する問題