package net.joelinn.quartz; import net.jodah.concurrentunit.Waiter; import org.junit.Test; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.impl.matchers.NameMatcher; import redis.clients.jedis.Jedis; import java.util.Properties; import static net.joelinn.quartz.TestUtils.createCronTrigger; import static net.joelinn.quartz.TestUtils.createJob; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; /** * @author Joe Linn * 10/4/2016 */ public class MultiThreadedIntegrationTest extends BaseIntegrationTest { @Override protected Properties schedulerConfig(String host, int port) { Properties config = super.schedulerConfig(host, port); config.setProperty("org.quartz.threadPool.threadCount", "2"); return config; } @Test public void testCompleteListener() throws Exception { final String jobName = "oneJob"; JobDetail jobDetail = createJob(TestJob.class, jobName, "oneGroup"); final String triggerName = "trigger1"; CronTrigger trigger = createCronTrigger(triggerName, "oneGroup", "* * * * * ?"); Waiter waiter = new Waiter(); scheduler.scheduleJob(jobDetail, trigger); scheduler.getListenerManager().addTriggerListener(new CompleteListener(waiter), NameMatcher.triggerNameEquals(triggerName)); // wait for CompleteListener.triggerComplete() to be called waiter.await(1500); } @Test public void testTriggerData() throws Exception { final String jobName = "good"; JobDetail jobDetail = createJob(DataJob.class, jobName, "goodGroup"); final String triggerName = "trigger1"; final String everySecond = "* * * * * ?"; CronTrigger trigger = createCronTrigger(triggerName, "oneGroup", everySecond); trigger = trigger.getTriggerBuilder() .usingJobData("foo", "bar") .build(); scheduler.setJobFactory(new RedisJobFactory()); scheduler.scheduleJob(jobDetail, trigger); Waiter waiter = new Waiter(); scheduler.getListenerManager().addTriggerListener(new CompleteListener(waiter), NameMatcher.triggerNameEquals(triggerName)); // wait for CompleteListener.triggerComplete() to be called waiter.await(1500); try (Jedis jedis = jedisPool.getResource()) { assertThat(jedis.get("foo"), equalTo("bar")); } } @Test public void testDisallowConcurrent() throws Exception { JobDetail job1 = createJob(SingletonSleepJob.class, "job1", "group1"); CronTrigger trigger1 = createCronTrigger("trigger1", "group1", "* * * * * ?"); CronTrigger trigger2 = createCronTrigger("trigger2", "group2", "* * * * * ?") .getTriggerBuilder() .forJob(job1) .build(); Waiter waiter = new Waiter(); scheduler.getListenerManager().addTriggerListener(new CompleteListener(waiter), NameMatcher.triggerNameEquals(trigger1.getKey().getName())); scheduler.scheduleJob(job1, trigger1); //scheduler.scheduleJob(trigger2); waiter.await(6000, 2); assertThat(SingletonSleepJob.concurrentExecutions.get(), equalTo(0)); } }