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 2012/06/04 14:03:35 UTC

svn commit: r1345931 - in /camel/trunk/components/camel-quartz/src: main/java/org/apache/camel/component/quartz/ test/java/org/apache/camel/component/quartz/ test/resources/org/apache/camel/component/quartz/

Author: davsclaus
Date: Mon Jun  4 12:03:35 2012
New Revision: 1345931

URL: http://svn.apache.org/viewvc?rev=1345931&view=rev
Log:
CAMEL-5259: Fixed quartz component need to use unique management name for CamelContext, on jobs to pickup correct context, in case multiple Camel apps with same name is running in the JVM.

Added:
    camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextSameNameClashTest.java
      - copied, changed from r1345843, camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextTest.java
Modified:
    camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java
    camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzConstants.java
    camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java
    camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml
    camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml

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=1345931&r1=1345930&r2=1345931&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 Mon Jun  4 12:03:35 2012
@@ -53,7 +53,6 @@ import org.slf4j.LoggerFactory;
  */
 public class QuartzComponent extends DefaultComponent implements StartupListener {
     private static final transient Logger LOG = LoggerFactory.getLogger(QuartzComponent.class);
-    private final AtomicInteger jobs = new AtomicInteger();
     private Scheduler scheduler;
     private final List<JobToAdd> jobsToAdd = new ArrayList<JobToAdd>();
     private SchedulerFactory factory;
@@ -165,7 +164,8 @@ public class QuartzComponent extends Def
     public void onCamelContextStarted(CamelContext camelContext, boolean alreadyStarted) throws Exception {
         if (scheduler != null) {
             // register current camel context to scheduler so we can look it up when jobs is being triggered
-            scheduler.getContext().put(QuartzConstants.QUARTZ_CAMEL_CONTEXT + "-" + getCamelContext().getName(), getCamelContext());
+            // must use management name as it should be unique in the same JVM
+            scheduler.getContext().put(QuartzConstants.QUARTZ_CAMEL_CONTEXT + "-" + getCamelContext().getManagementName(), getCamelContext());
         }
 
         // if not configure to auto start then don't start it
@@ -191,9 +191,9 @@ public class QuartzComponent extends Def
         super.doStop();
 
         if (scheduler != null) {
-            int number = jobs.get();
-            if (number > 0) {
-                LOG.info("Cannot shutdown Quartz scheduler: " + scheduler.getSchedulerName() + " as there are still " + number + " jobs registered.");
+            AtomicInteger number = (AtomicInteger) scheduler.getContext().get("CamelJobs");
+            if (number != null && number.get() > 0) {
+                LOG.info("Cannot shutdown Quartz scheduler: " + scheduler.getSchedulerName() + " as there are still " + number.get() + " jobs registered.");
             } else {
                 // no more jobs then shutdown the scheduler
                 LOG.info("There are no more jobs registered, so shutting down Quartz scheduler: " + scheduler.getSchedulerName());
@@ -214,7 +214,7 @@ public class QuartzComponent extends Def
     }
 
     private void doAddJob(JobDetail job, Trigger trigger) throws SchedulerException {
-        jobs.incrementAndGet();
+        incrementJobCounter(getScheduler());
 
         Trigger existingTrigger = getScheduler().getTrigger(trigger.getName(), trigger.getGroup());
         if (existingTrigger == null) {
@@ -254,7 +254,7 @@ public class QuartzComponent extends Def
     }
 
     public void pauseJob(Trigger trigger) throws SchedulerException {
-        jobs.decrementAndGet();
+        decrementJobCounter(getScheduler());
 
         if (isClustered()) {
             // do not pause jobs which are clustered, as we want the jobs to continue running on the other nodes
@@ -470,8 +470,31 @@ public class QuartzComponent extends Def
         }
 
         // register current camel context to scheduler so we can look it up when jobs is being triggered
-        scheduler.getContext().put(QuartzConstants.QUARTZ_CAMEL_CONTEXT + "-" + getCamelContext().getName(), getCamelContext());
+        // must use management name as it should be unique in the same JVM
+        scheduler.getContext().put(QuartzConstants.QUARTZ_CAMEL_CONTEXT + "-" + getCamelContext().getManagementName(), getCamelContext());
+
+        // store Camel job counter
+        AtomicInteger number = (AtomicInteger) scheduler.getContext().get("CamelJobs");
+        if (number == null) {
+            number = new AtomicInteger(0);
+            scheduler.getContext().put("CamelJobs", number);
+        }
+
         return scheduler;
     }
 
+    private static void decrementJobCounter(Scheduler scheduler) throws SchedulerException {
+        AtomicInteger number = (AtomicInteger) scheduler.getContext().get("CamelJobs");
+        if (number != null) {
+            number.decrementAndGet();
+        }
+    }
+
+    private static void incrementJobCounter(Scheduler scheduler) throws SchedulerException {
+        AtomicInteger number = (AtomicInteger) scheduler.getContext().get("CamelJobs");
+        if (number != null) {
+            number.incrementAndGet();
+        }
+    }
+
 }

Modified: camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzConstants.java?rev=1345931&r1=1345930&r2=1345931&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzConstants.java (original)
+++ camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzConstants.java Mon Jun  4 12:03:35 2012
@@ -23,6 +23,7 @@ public final class QuartzConstants {
 
     public static final String QUARTZ_ENDPOINT_URI = "CamelQuartzEndpoint";
 
+    // Note: using the CamelContext management name to ensure its unique in the JVM
     public static final String QUARTZ_CAMEL_CONTEXT_NAME = "CamelQuartzCamelContextName";
 
     public static final String QUARTZ_CAMEL_CONTEXT = "CamelQuartzCamelContext";

Modified: camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java?rev=1345931&r1=1345930&r2=1345931&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java (original)
+++ camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java Mon Jun  4 12:03:35 2012
@@ -70,7 +70,8 @@ public class QuartzEndpoint extends Defa
             trigger.setStartTime(new Date());
         }
         detail.getJobDataMap().put(QuartzConstants.QUARTZ_ENDPOINT_URI, getEndpointUri());
-        detail.getJobDataMap().put(QuartzConstants.QUARTZ_CAMEL_CONTEXT_NAME, getCamelContext().getName());
+        // must use management name as it should be unique in the same JVM
+        detail.getJobDataMap().put(QuartzConstants.QUARTZ_CAMEL_CONTEXT_NAME, getCamelContext().getManagementName());
         if (detail.getJobClass() == null) {
             detail.setJobClass(isStateful() ? StatefulCamelJob.class : CamelJob.class);
         }

Copied: camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextSameNameClashTest.java (from r1345843, camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextSameNameClashTest.java?p2=camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextSameNameClashTest.java&p1=camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextTest.java&r1=1345843&r2=1345931&rev=1345931&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextTest.java (original)
+++ camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/QuartzTwoCamelContextSameNameClashTest.java Mon Jun  4 12:03:35 2012
@@ -27,7 +27,7 @@ import org.junit.Test;
 /**
  * @version 
  */
-public class QuartzTwoCamelContextTest extends Assert {
+public class QuartzTwoCamelContextSameNameClashTest extends Assert {
 
     private DefaultCamelContext camel1;
     private DefaultCamelContext camel2;
@@ -35,21 +35,25 @@ public class QuartzTwoCamelContextTest e
     @Before
     public void setUp() throws Exception {
         camel1 = new DefaultCamelContext();
-        camel1.setName("camel-1");
+        camel1.setName("myCamel");
         camel1.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("quartz://myGroup/myTimerName?cron=0/1+*+*+*+*+?").to("mock:one");
+                from("quartz://myGroup/myTimerName?cron=0/1+*+*+*+*+?")
+                    .log("Fired one")
+                    .to("mock:one");
             }
         });
         camel1.start();
 
         camel2 = new DefaultCamelContext();
-        camel2.setName("camel-2");
+        camel2.setName("myCamel");
         camel2.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("quartz://myOtherGroup/myOtherTimerName?cron=0/1+*+*+*+*+?").to("mock:two");
+                from("quartz://myOtherGroup/myOtherTimerName?cron=0/1+*+*+*+*+?")
+                    .log("Fired two")
+                    .to("mock:two");
             }
         });
         camel2.start();
@@ -63,6 +67,8 @@ public class QuartzTwoCamelContextTest e
 
     @Test
     public void testTwoCamelContext() throws Exception {
+        assertNotSame(camel1.getManagementName(), camel2.getManagementName());
+
         MockEndpoint mock1 = camel1.getEndpoint("mock:one", MockEndpoint.class);
         mock1.expectedMinimumMessageCount(2);
 
@@ -76,28 +82,5 @@ public class QuartzTwoCamelContextTest e
 
         camel2.stop();        
     }
-    
-    @Test
-    public void testThirdCamelContext() throws Exception {
-        camel1.stop();
-        
-        camel2.stop();
-                
-        DefaultCamelContext camel3 = new DefaultCamelContext();
-        camel3.setName("camel-3");
-        camel3.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("quartz://myThirdGroup/myThirdTimerName?cron=0/1+*+*+*+*+?").to("mock:three");
-            }
-        });
-        camel3.start();
-        
-        MockEndpoint mock3 = camel3.getEndpoint("mock:three", MockEndpoint.class);
-        mock3.expectedMinimumMessageCount(2);
-        
-        mock3.assertIsSatisfied();
-        camel3.stop();
-    }
 
 }

Modified: camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml?rev=1345931&r1=1345930&r2=1345931&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml (original)
+++ camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml Mon Jun  4 12:03:35 2012
@@ -56,7 +56,7 @@
     </property>
   </bean>
 
-  <camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
+  <camelContext id="camelContext" managementNamePattern="#name#" xmlns="http://camel.apache.org/schema/spring">
     <route>
       <from uri="quartz://app/test?trigger.repeatInterval=1000&amp;trigger.repeatCount=-1&amp;stateful=true"/>
       <to uri="log:trigger"/>

Modified: camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml?rev=1345931&r1=1345930&r2=1345931&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml (original)
+++ camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml Mon Jun  4 12:03:35 2012
@@ -56,7 +56,7 @@
     </property>
   </bean>
 
-  <camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
+  <camelContext id="camelContext" managementNamePattern="#name#" xmlns="http://camel.apache.org/schema/spring">
     <route id="myRoute">
       <from uri="quartz://app/test?trigger.repeatInterval=1000&amp;trigger.repeatCount=-1&amp;stateful=true"/>
       <to uri="log:trigger"/>