/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.camel.component.quartz2; import org.apache.camel.FailedToCreateRouteException; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; import org.junit.After; import org.junit.Assert; import org.junit.Test; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerKey; /** * Check for duplicate name/group collision. */ public class QuartzNameCollisionTest { private DefaultCamelContext camel1; private DefaultCamelContext camel2; @Test public void testDupeName() throws Exception { camel1 = new DefaultCamelContext(); camel1.setName("camel-1"); camel1.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?cron=0/1+*+*+*+*+?").to("log:one", "mock:one"); } }); camel1.start(); try { camel1.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?cron=0/2+*+*+*+*+?").to("log:two", "mock:two"); } }); Assert.fail("Should have thrown an exception"); } catch (FailedToCreateRouteException e) { String reason = e.getMessage(); Assert.assertEquals(reason.indexOf("Trigger key myGroup.myTimerName is already in use") >= 0, true); } } @Test public void testDupeNameMultiContext() throws Exception { camel1 = new DefaultCamelContext(); camel1.setName("camel-1"); camel1.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?cron=0/1+*+*+*+*+?").to("log:one", "mock:one"); } }); camel1.start(); camel2 = new DefaultCamelContext(); camel2.setName("camel-2"); camel2.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName=0/2+*+*+*+*+?").to("log:two", "mock:two"); } }); camel2.start(); } /** * Don't check for a name collision if the job is stateful. */ @Test public void testNoStatefulCollisionError() throws Exception { camel1 = new DefaultCamelContext(); camel1.setName("camel-1"); camel1.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?stateful=true&cron=0/1+*+*+*+*+?").to("log:one", "mock:one"); } }); camel1.start(); camel2 = new DefaultCamelContext(); camel2.setName("camel-2"); camel2.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?stateful=true").to("log:two", "mock:two"); } }); camel2.start(); // if no exception is thrown then this test passed. } /** * Make sure a resume doesn't trigger a dupe name error. */ @Test public void testRestart() throws Exception { DefaultCamelContext camel = new DefaultCamelContext(); camel.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?cron=0/1+*+*+*+*+?").to("log:one", "mock:one"); } }); // traverse a litany of states camel.start(); Thread.sleep(100); camel.suspend(); Thread.sleep(100); camel.resume(); Thread.sleep(100); camel.stop(); Thread.sleep(100); camel.start(); Thread.sleep(100); camel.stop(); } /** * Confirm the quartz trigger is removed on route stop. */ @Test public void testRemoveJob() throws Exception { camel1 = new DefaultCamelContext(); camel1.setName("camel-1"); camel1.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?cron=0/1+*+*+*+*+?").id("route-1").to("log:one", "mock:one"); } }); camel1.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("quartz2://myGroup2/myTimerName?cron=0/1+*+*+*+*+?").id("route-2").to("log:one", "mock:one"); } }); camel1.start(); QuartzComponent component = (QuartzComponent) camel1.getComponent("quartz2"); Scheduler scheduler = component.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey("myTimerName", "myGroup"); Trigger trigger = scheduler.getTrigger(triggerKey); Assert.assertNotNull(trigger); camel1.stopRoute("route-1"); Trigger.TriggerState triggerState = component.getScheduler().getTriggerState(triggerKey); Assert.assertNotNull(trigger); Assert.assertEquals(Trigger.TriggerState.PAUSED, triggerState); } @After public void cleanUp() throws Exception { if (camel1 != null) { camel1.stop(); camel1 = null; } if (camel2 != null) { camel2.stop(); camel2 = null; } } }