Можете ли вы запустить два разных экземпляра задания Quartz последовательно?

Привет, у меня Задание 1 сработало в одну минуту, а задание 2 сработало каждые 5 минут. Итак, каждые пять минут обе работы будут выполняться одновременно, я хочу избежать этого и заставить второе задание запускаться, чтобы дождаться завершения другого перед началом. Я видел @DisallowConcurrentExecution, но это позволит избежать параллельного запуска только для двух экземпляров одинаковых заданий, а не между разными заданиями.

1 ответ

Для тех, кто заинтересован, мне удалось объединить обе работы в одну, но с двумя разными триггерами, указывающими на одну и ту же работу. Каждый триггер имеет свое время срабатывания, и теперь параметры хранятся в карте данных каждого триггера, а не в карте данных задания. Также политика пропуска зажигания была изменена на 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();

}
Другие вопросы по тегам