/* * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * */ package org.terracotta.quartz.tests; import static org.quartz.JobBuilder.newJob; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.Job; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.Scheduler; import org.quartz.Trigger; import org.terracotta.toolkit.concurrent.ToolkitBarrier; import java.util.Date; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import junit.framework.Assert; public class ManyTriggerClient extends ClientBase { private final ToolkitBarrier barrier; private final static AtomicInteger counter = new AtomicInteger(0); public ManyTriggerClient(String[] args) { super(args); barrier = getClusteringToolkit().getBarrier("barrier", 2); } @Override protected boolean isStartingScheduler() { return false; } @Override protected void test(Scheduler sched) throws Throwable { int index = barrier.await(); int triggers = 1000; long now = System.currentTimeMillis() + 5000L; if (index == 0) { sched.start(); barrier.await(); final int duration = 90; while (counter.get() < triggers && System.currentTimeMillis() < now + (triggers / 10 * 500) + TimeUnit.SECONDS.toMillis(duration)) { Thread.sleep(1500); System.out.println(new Date() + " - Waiting on another " + (triggers - counter.get()) + " triggers to fire"); } Assert.assertEquals("All " + triggers + " triggers should have fired by now (" + new Date() + ")", triggers, counter.get()); } else { barrier.await(); JobDetail jobDetail = newJob(MyJob.class).withIdentity("testJob").storeDurably(true).build(); sched.addJob(jobDetail, false); for (int i = 0; i < triggers; i++) { Trigger trigger = newTrigger().forJob("testJob").withIdentity("trigger" + i, "group") .startAt(new Date(now + ((i / (triggers / 10)) + 1) * 500)) .withSchedule(simpleSchedule().withMisfireHandlingInstructionFireNow()).build(); sched.scheduleJob(trigger); } } if (index == 0) { sched.shutdown(); } } public static class MyJob implements Job { public void execute(final JobExecutionContext context) { try { System.err.println(new Date() + " - " + context.getTrigger().getKey().getGroup() + ": Hi there"); ManyTriggerClient.counter.incrementAndGet(); } catch (Exception e) { e.printStackTrace(System.err); throw new RuntimeException(e); } } } }