簡體   English   中英

您可以順序運行兩個不同的Quartz作業實例嗎?

[英]Can you run two different Quartz job instances sequentially?

嗨,我有一個作業1觸發了很短的觸發時間,一個作業2觸發了每5分鍾觸發一次。 因此,每五分鍾一次wo作業將同時運行,我想避免這種情況,並強制第二個作業觸發以等待另一個作業完成后再開始。 我已經看到了@DisallowConcurrentExecution,但這只會避免為同一作業的兩個實例而不是在不同作業之間並行運行。

對於那些感興趣的人,我設法將兩個作業融合為一個,但有兩個指向同一作業的不同觸發器。 每個觸發器都有自己的觸發時間,並且參數現在保存在每個觸發器的數據圖中,而不是作業數據圖中。 此外,誤發政策已更改為MisfireHandlingInstructionFireAndProceed

這是代碼:

public class QuartzTest {

    public static final String PROCESS_TRIGGER_MAP_KEY = "process";

    public static void main( String[] args ) throws SchedulerException, InterruptedException {
    SchedulerFactory schedulerFactory = new StdSchedulerFactory();
    Scheduler scheduler = schedulerFactory.getScheduler();
    scheduler.start();

    JobDetail job1 = newJob( TestJob.class ).withIdentity( "job1", "group1" ).build();
    CronTrigger trigger1 = newTrigger().withIdentity( "trigger1", "group1" ).startAt( new Date() ).withSchedule( cronSchedule( getCronExpression( 1 ) ).withMisfireHandlingInstructionFireAndProceed() ).build();
    trigger1.getJobDataMap().put( PROCESS_TRIGGER_MAP_KEY, new MessagePrinter() {

        @Override
        public void print() {
        System.out.println( new Timestamp( System.currentTimeMillis() ) + " This is process 1" );
        }
    } );
    scheduler.scheduleJob( job1, trigger1 );

    CronTrigger trigger2 = newTrigger().withIdentity( "trigger2", "group1" ).forJob( job1 ).startAt( new Date() ).withSchedule( cronSchedule( getCronExpression( 2 ) ).withMisfireHandlingInstructionFireAndProceed() ).build();
    trigger2.getJobDataMap().put( PROCESS_TRIGGER_MAP_KEY, new MessagePrinter() {

        @Override
        public void print() {
        System.out.println( new Timestamp( System.currentTimeMillis() ) + " This is process 2" );
        }
    } );
    scheduler.scheduleJob( trigger2 );

    Thread.sleep( 5 * 60 * 1000 );
    }

    private static String getCronExpression( int interval ) {
    return "0 */" + interval + " * * * ?";

    }

}

這是工作類別

@DisallowConcurrentExecution
public class TestJob implements Job {

    @Override
    public void execute( JobExecutionContext context ) throws JobExecutionException {
    MessagePrinter mp = (MessagePrinter) context.getTrigger().getJobDataMap().get( QuartzTest.PROCESS_TRIGGER_MAP_KEY );
    if ( mp != null ) {
        mp.print();
    } else {
        System.out.println( new Timestamp( System.currentTimeMillis() ) + " Job started" );
    }
    System.out.println( new Timestamp( System.currentTimeMillis() ) + " Job sleeping 10s..." );
    try {
        Thread.sleep( 10 * 1000 );
    } catch ( InterruptedException e ) {
        e.printStackTrace();
    }
    System.out.println( new Timestamp( System.currentTimeMillis() ) + " Job finished." );
    }

}

和處理器類:

public abstract class MessagePrinter {
    public MessagePrinter() {

    }

    public abstract void print();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM