You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2011/02/06 10:55:29 UTC

svn commit: r1067624 - in /camel/trunk: components/camel-quartz/src/main/java/org/apache/camel/component/quartz/ components/camel-quartz/src/test/java/org/apache/camel/component/quartz/ tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/q...

Author: davsclaus
Date: Sun Feb  6 09:55:29 2011
New Revision: 1067624

URL: http://svn.apache.org/viewvc?rev=1067624&view=rev
Log:
CAMEL-3633: Forced disabling Quartz update checker. CAMEL-3579: You can now use multiple QuartzScheduler instances in the same JVM classloader. Thanks to Sergey for the patch.

Modified:
    camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java
    camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzNameCollisionTest.java
    camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/quartz/QuartzCronRouteTest.java

Modified: camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java?rev=1067624&r1=1067623&r2=1067624&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java (original)
+++ camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java Sun Feb  6 09:55:29 2011
@@ -30,6 +30,7 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.camel.CamelContext;
 import org.apache.camel.StartupListener;
 import org.apache.camel.impl.DefaultComponent;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.ObjectHelper;
 import org.quartz.CronTrigger;
@@ -53,8 +54,8 @@ import org.slf4j.LoggerFactory;
  */
 public class QuartzComponent extends DefaultComponent implements StartupListener {
     private static final transient Logger LOG = LoggerFactory.getLogger(QuartzComponent.class);
-    private static final AtomicInteger JOBS = new AtomicInteger();
-    private static Scheduler scheduler;
+    private final AtomicInteger jobs = new AtomicInteger();
+    private Scheduler scheduler;
     private final List<JobToAdd> jobsToAdd = new ArrayList<JobToAdd>();
     private SchedulerFactory factory;
     private Properties properties;
@@ -186,7 +187,7 @@ public class QuartzComponent extends Def
         super.doStop();
 
         if (scheduler != null) {
-            int number = JOBS.get();
+            int number = jobs.get();
             if (number > 0) {
                 LOG.info("Cannot shutdown Quartz scheduler: " + scheduler.getSchedulerName() + " as there are still " + number + " jobs registered.");
             } else {
@@ -209,7 +210,7 @@ public class QuartzComponent extends Def
     }
 
     private void doAddJob(JobDetail job, Trigger trigger) throws SchedulerException {
-        JOBS.incrementAndGet();
+        jobs.incrementAndGet();
 
         Trigger existingTrigger = getScheduler().getTrigger(trigger.getName(), trigger.getGroup());
         if (existingTrigger == null) {
@@ -245,7 +246,7 @@ public class QuartzComponent extends Def
     }
 
     public void pauseJob(Trigger trigger) throws SchedulerException {
-        JOBS.decrementAndGet();
+        jobs.decrementAndGet();
 
         if (isClustered()) {
             // do not pause jobs which are clustered, as we want the jobs to continue running on the other nodes
@@ -268,7 +269,7 @@ public class QuartzComponent extends Def
                 LOG.debug("Cannot delete job using trigger: " + group + "/" + name + " as the JobStore is clustered.");
             }
         } else {
-            Trigger trigger = getScheduler().getTrigger(name, group);
+            Trigger trigger  = getScheduler().getTrigger(name, group);
             if (trigger != null) {
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("Deleting job using trigger: " + group + "/" + name);
@@ -341,7 +342,7 @@ public class QuartzComponent extends Def
         return factory;
     }
 
-    public void setFactory(final SchedulerFactory factory) {
+    public void setFactory(SchedulerFactory factory) {
         this.factory = factory;
     }
 
@@ -353,7 +354,7 @@ public class QuartzComponent extends Def
     }
 
     public void setScheduler(final Scheduler scheduler) {
-        QuartzComponent.scheduler = scheduler;
+        this.scheduler = scheduler;
     }
 
     public Properties getProperties() {
@@ -412,15 +413,54 @@ public class QuartzComponent extends Def
     }
 
     protected SchedulerFactory createSchedulerFactory() throws SchedulerException {
+        SchedulerFactory answer;
+
         Properties prop = loadProperties();
         if (prop != null) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Creating SchedulerFactory with properties: " + prop);
-            }
-            return new StdSchedulerFactory(prop);
+
+            // force disabling update checker (will do online check over the internet)
+            prop.put("org.quartz.scheduler.skipUpdateCheck", "true");
+
+            answer = new StdSchedulerFactory(prop);
         } else {
-            return new StdSchedulerFactory();
+            // read default props to be able to use a single scheduler per camel context
+            // if we need more than one scheduler per context use setScheduler(Scheduler) 
+            // or setFactory(SchedulerFactory) methods
+
+            // must use classloader from StdSchedulerFactory to work even in OSGi
+            InputStream is = StdSchedulerFactory.class.getClassLoader().getResourceAsStream("org/quartz/quartz.properties");
+            if (is == null) {
+                throw new SchedulerException("Quartz properties file not found in classpath: org/quartz/quartz.properties");
+            }
+            prop = new Properties();
+            try {
+                prop.load(is);
+            } catch (IOException e) {
+                throw new SchedulerException("Error loading Quartz properties file from classpath: org/quartz/quartz.properties", e);
+            }
+
+            // camel context name will be a suffix to use one scheduler per context
+            String identity = getCamelContext().getName();
+
+            String instName = prop.getProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME);
+            if (instName == null) {
+                instName = "scheduler-" + identity;
+            } else {
+                instName = instName + "-" + identity;
+            }
+            prop.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, instName);
+
+            // force disabling update checker (will do online check over the internet)
+            prop.put("org.quartz.scheduler.skipUpdateCheck", "true");
+
+            answer = new StdSchedulerFactory(prop);
         }
+
+        if (LOG.isDebugEnabled()) {
+            String name = prop.getProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME);
+            LOG.debug("Creating SchedulerFactory: " + name + " with properties: " + prop);
+        }
+        return answer;
     }
 
     protected Scheduler createScheduler() throws SchedulerException {

Modified: camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzNameCollisionTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzNameCollisionTest.java?rev=1067624&r1=1067623&r2=1067624&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzNameCollisionTest.java (original)
+++ camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzNameCollisionTest.java Sun Feb  6 09:55:29 2011
@@ -43,9 +43,7 @@ public class QuartzNameCollisionTest {
         });
         camel1.start();
 
-        camel2 = new DefaultCamelContext();
-        QuartzComponent component2 = new QuartzComponent(camel2);
-
+        QuartzComponent component2 = new QuartzComponent(camel1);
         try {
             component2.createEndpoint("quartz://myGroup/myTimerName");
             Assert.fail("Should have thrown an exception");
@@ -54,6 +52,22 @@ public class QuartzNameCollisionTest {
         }
     }
 
+    @Test
+    public void testDupeNameMultiContext() throws Exception {
+        camel1 = new DefaultCamelContext();
+        camel1.setName("camel-1");
+        camel1.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("quartz://myGroup/myTimerName?cron=0/1+*+*+*+*+?").to("log:one", "mock:one");
+            }
+        });
+        camel1.start();
+
+        camel2 = new DefaultCamelContext();
+        QuartzComponent component2 = new QuartzComponent(camel2);
+        component2.createEndpoint("quartz://myGroup/myTimerName");
+    }
 
     /**
      * Don't check for a name collision if the job is stateful.
@@ -116,32 +130,29 @@ public class QuartzNameCollisionTest {
         camel1.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("quartz://myGroup/myTimerName?cron=0/1+*+*+*+*+?").to("log:one", "mock:one");
+                from("quartz://myGroup/myTimerName?cron=0/1+*+*+*+*+?").id("route-1").to("log:one", "mock:one");
             }
         });
-        camel1.start();
 
-        camel2 = new DefaultCamelContext();
-        camel2.setName("camel-2");
-        camel2.addRoutes(new RouteBuilder() {
+        camel1.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("quartz://myGroup2/myTimerName?cron=0/1+*+*+*+*+?").to("log:one", "mock:one");
+                from("quartz://myGroup2/myTimerName?cron=0/1+*+*+*+*+?").id("route-2").to("log:one", "mock:one");
             }
         });
-        camel2.start();
+
+        camel1.start();
 
         QuartzComponent component = (QuartzComponent) camel1.getComponent("quartz");
         Scheduler scheduler = component.getScheduler();
         Trigger trigger = scheduler.getTrigger("myTimerName", "myGroup");
         Assert.assertNotNull(trigger);
+        
+        camel1.stopRoute("route-1");
 
-        camel1.stop();
-
-        trigger = scheduler.getTrigger("myTimerName", "myGroup");
-        Assert.assertNull(trigger);
-
-        camel2.stop();
+        int triggerState = component.getScheduler().getTriggerState("myTimerName", "myGroup");
+        Assert.assertNotNull(trigger);
+        Assert.assertEquals(Trigger.STATE_PAUSED, triggerState);
     }
 
     @After

Modified: camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/quartz/QuartzCronRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/quartz/QuartzCronRouteTest.java?rev=1067624&r1=1067623&r2=1067624&view=diff
==============================================================================
--- camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/quartz/QuartzCronRouteTest.java (original)
+++ camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/quartz/QuartzCronRouteTest.java Sun Feb  6 09:55:29 2011
@@ -19,7 +19,6 @@ package org.apache.camel.itest.osgi.quar
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.itest.osgi.OSGiIntegrationTestSupport;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Option;
@@ -34,7 +33,6 @@ import static org.ops4j.pax.exam.contain
 import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.workingDirectory;
 
 @RunWith(JUnit4TestRunner.class)
-@Ignore("TODO: Test hangs")
 public class QuartzCronRouteTest extends OSGiIntegrationTestSupport {
 
     @Test
@@ -61,7 +59,7 @@ public class QuartzCronRouteTest extends
             // install the spring dm profile
             profile("spring.dm").version("1.2.0"),
             // this is how you set the default log level when using pax logging (logProfile)
-            org.ops4j.pax.exam.CoreOptions.systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),
+            org.ops4j.pax.exam.CoreOptions.systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG"),
 
             // using the features to install the camel components
             scanFeatures(getCamelKarafFeatureUrl(),
@@ -69,7 +67,8 @@ public class QuartzCronRouteTest extends
 
             workingDirectory("target/paxrunner/"),
 
-            felix(), equinox());
+            // TODO: test hang on shutdown on equionox
+            felix());
 
         return options;
     }