Author: davsclaus
Date: Fri Mar 16 09:41:31 2012
New Revision: 1301394

URL: http://svn.apache.org/viewvc?rev=1301394&view=rev
Log:
CAMEL-4900: Fixed issue with restarting app with persistent Quartz job store.

Added:
    
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartAppTest.java
   (contents, props changed)
      - copied, changed from r1301376, 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java
    
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartRouteTest.java
      - copied, changed from r1301376, 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java
    
camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml
      - copied, changed from r1301376, 
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
    
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=1301394&r1=1301393&r2=1301394&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
 Fri Mar 16 09:41:31 2012
@@ -21,7 +21,6 @@ import java.io.InputStream;
 import java.net.URI;
 import java.text.ParseException;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -223,14 +222,23 @@ public class QuartzComponent extends Def
             getScheduler().scheduleJob(job, trigger);
         } else if (hasTriggerChanged(existingTrigger, trigger)) {
             LOG.debug("Trigger: {}/{} already exists and will be updated by 
Quartz.", trigger.getGroup(), trigger.getName());
+            // fast forward start time to now, as we do not want any misfire 
to kick in
+            trigger.setStartTime(new Date());
+            // replace job, and relate trigger to previous job name, which is 
needed to reschedule job
             scheduler.addJob(job, true);
-            trigger.setJobName(job.getName());
+            trigger.setJobName(existingTrigger.getJobName());
             scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), 
trigger);
         } else {
-            LOG.debug("Trigger: {}/{} already exists and will be resumed 
automatically by Quartz.", trigger.getGroup(), trigger.getName());
             if (!isClustered()) {
-                trigger.setStartTime(Calendar.getInstance().getTime());
+                LOG.debug("Trigger: {}/{} already exists and will be resumed 
by Quartz.", trigger.getGroup(), trigger.getName());
+                // fast forward start time to now, as we do not want any 
misfire to kick in
+                trigger.setStartTime(new Date());
+                // replace job, and relate trigger to previous job name, which 
is needed to reschedule job
+                scheduler.addJob(job, true);
+                trigger.setJobName(existingTrigger.getJobName());
                 scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), 
trigger);
+            } else {
+                LOG.debug("Trigger: {}/{} already exists and is already 
scheduled by clustered JobStore.", trigger.getGroup(), trigger.getName());
             }
         }
     }

Copied: 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartAppTest.java
 (from r1301376, 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartAppTest.java?p2=camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartAppTest.java&p1=camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java&r1=1301376&r2=1301394&rev=1301394&view=diff
==============================================================================
--- 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java
 (original)
+++ 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartAppTest.java
 Fri Mar 16 09:41:31 2012
@@ -16,8 +16,10 @@
  */
 package org.apache.camel.component.quartz;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit4.CamelSpringTestSupport;
+import org.apache.camel.test.junit4.TestSupport;
+import org.apache.camel.util.ObjectHelper;
 import org.junit.Test;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
@@ -25,19 +27,50 @@ import org.springframework.context.suppo
 /**
  * @version 
  */
-public class SpringQuartzPersistentStoreTest extends CamelSpringTestSupport {
-
-    @Override
-    protected AbstractXmlApplicationContext createApplicationContext() {
-        return new 
ClassPathXmlApplicationContext("org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml");
-    }
+public class SpringQuartzPersistentStoreRestartAppTest extends TestSupport {
 
     @Test
-    public void testQuartzPersistentStore() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:result");
+    public void testQuartzPersistentStoreRestart() throws Exception {
+        // load spring app
+        AbstractXmlApplicationContext app = new 
ClassPathXmlApplicationContext("org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml");
+
+        app.start();
+
+        CamelContext camel = app.getBean("camelContext", CamelContext.class);
+        assertNotNull(camel);
+
+        MockEndpoint mock = camel.getEndpoint("mock:result", 
MockEndpoint.class);
         mock.expectedMinimumMessageCount(3);
 
-        assertMockEndpointsSatisfied();
+        mock.assertIsSatisfied();
+
+        app.stop();
+        
+        log.info("Restarting ...");
+        log.info("Restarting ...");
+        log.info("Restarting ...");
+
+        // NOTE:
+        // To test a restart where the app has crashed, then you can in 
QuartzEndpoint
+        // in the doShutdown method, then remove the following code line
+        //  deleteTrigger(getTrigger());
+        // then when we restart then there is old stale data which 
QuartzComponent
+        // is supposed to handle and start again
+
+        // load spring app
+        AbstractXmlApplicationContext app2 = new 
ClassPathXmlApplicationContext("org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml");
+
+        app2.start();
+
+        CamelContext camel2 = app2.getBean("camelContext", CamelContext.class);
+        assertNotNull(camel2);
+
+        MockEndpoint mock2 = camel2.getEndpoint("mock:result", 
MockEndpoint.class);
+        mock2.expectedMinimumMessageCount(3);
+
+        mock2.assertIsSatisfied();
+
+        app2.stop();
     }
 
 }

Propchange: 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartAppTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartRouteTest.java
 (from r1301376, 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartRouteTest.java?p2=camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartRouteTest.java&p1=camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java&r1=1301376&r2=1301394&rev=1301394&view=diff
==============================================================================
--- 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.java
 (original)
+++ 
camel/trunk/components/camel-quartz/src/test/java/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartRouteTest.java
 Fri Mar 16 09:41:31 2012
@@ -25,7 +25,7 @@ import org.springframework.context.suppo
 /**
  * @version 
  */
-public class SpringQuartzPersistentStoreTest extends CamelSpringTestSupport {
+public class SpringQuartzPersistentStoreRestartRouteTest extends 
CamelSpringTestSupport {
 
     @Override
     protected AbstractXmlApplicationContext createApplicationContext() {
@@ -35,7 +35,25 @@ public class SpringQuartzPersistentStore
     @Test
     public void testQuartzPersistentStore() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedMinimumMessageCount(3);
+        mock.expectedMinimumMessageCount(2);
+
+        assertMockEndpointsSatisfied();
+
+        // restart route
+        context().stopRoute("myRoute");
+        mock.reset();
+        mock.expectedMessageCount(0);
+
+        // wait a bit
+        Thread.sleep(2000);
+
+        assertMockEndpointsSatisfied();
+
+        // start route, and we got messages again
+        mock.reset();
+        mock.expectedMinimumMessageCount(2);
+
+        context().startRoute("myRoute");
 
         assertMockEndpointsSatisfied();
     }

Copied: 
camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml
 (from r1301376, 
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/SpringQuartzPersistentStoreRestartTest.xml?p2=camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreRestartTest.xml&p1=camel/trunk/components/camel-quartz/src/test/resources/org/apache/camel/component/quartz/SpringQuartzPersistentStoreTest.xml&r1=1301376&r2=1301394&rev=1301394&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/SpringQuartzPersistentStoreRestartTest.xml
 Fri Mar 16 09:41:31 2012
@@ -26,7 +26,7 @@
 
   <!-- the persistent store for quartz -->
   <jdbc:embedded-database id="camel_quartz" type="DERBY">
-    <jdbc:script location="classpath:tables_derby.sql"/>
+    <!-- do not load script as database alreaady exists -->
   </jdbc:embedded-database>
 
   <bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent">

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=1301394&r1=1301393&r2=1301394&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
 Fri Mar 16 09:41:31 2012
@@ -57,7 +57,7 @@
   </bean>
 
   <camelContext id="camelContext" 
xmlns="http://camel.apache.org/schema/spring";>
-    <route>
+    <route id="myRoute">
       <from 
uri="quartz://app/test?trigger.repeatInterval=1000&amp;trigger.repeatCount=-1&amp;stateful=true"/>
       <to uri="log:trigger"/>
       <to uri="mock:result"/>


Reply via email to