Author: davsclaus
Date: Wed Aug 25 15:45:11 2010
New Revision: 989179

URL: http://svn.apache.org/viewvc?rev=989179&view=rev
Log:
CAMEL-3079: Improved job rescheduling. Thanks to Ingo Duppe for patch.

Modified:
    
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/CamelJob.java
    
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/QuartzEndpoint.java
    
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/StatefulCamelJob.java

Modified: 
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/CamelJob.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/CamelJob.java?rev=989179&r1=989178&r2=989179&view=diff
==============================================================================
--- 
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/CamelJob.java
 (original)
+++ 
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/CamelJob.java
 Wed Aug 25 15:45:11 2010
@@ -30,6 +30,8 @@ import org.quartz.SchedulerException;
  */
 public class CamelJob implements Job, Serializable {
 
+    private static final long serialVersionUID = 26L;
+
     public void execute(JobExecutionContext context) throws 
JobExecutionException {
         String camelContextName = (String) 
context.getJobDetail().getJobDataMap().get(QuartzConstants.QUARTZ_CAMEL_CONTEXT_NAME);
         String endpointUri = (String) 
context.getJobDetail().getJobDataMap().get(QuartzConstants.QUARTZ_ENDPOINT_URI);

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=989179&r1=989178&r2=989179&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
 Wed Aug 25 15:45:11 2010
@@ -194,16 +194,36 @@ public class QuartzComponent extends Def
     private void doAddJob(JobDetail job, Trigger trigger) throws 
SchedulerException {
         JOBS.incrementAndGet();
 
-        if (getScheduler().getTrigger(trigger.getName(), trigger.getGroup()) 
== null) {
+        Trigger existingTrigger = getScheduler().getTrigger(trigger.getName(), 
trigger.getGroup());
+        if (existingTrigger == null) {
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Adding job using trigger: " + trigger.getGroup() + 
"/" + trigger.getName());
             }
             getScheduler().scheduleJob(job, trigger);
+        } else if (hasTriggerChanged(existingTrigger, trigger)) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Trigger: " + trigger.getGroup() + "/" + 
trigger.getName() + " already exists and will be updated by Quartz.");
+            }
+            scheduler.addJob(job, true);
+            trigger.setJobName(job.getName());
+            scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), 
trigger);
         } else {
             if (LOG.isDebugEnabled()) {
-                LOG.debug("Resuming job using trigger: " + trigger.getGroup() 
+ "/" + trigger.getName());
+                LOG.debug("Trigger: " + trigger.getGroup() + "/" + 
trigger.getName() + " already exists and will be resumed automatically by 
Quartz.");
             }
-            getScheduler().resumeTrigger(trigger.getName(), 
trigger.getGroup());
+            if (!isClustered()) {
+                scheduler.resumeTrigger(trigger.getName(), trigger.getGroup());
+            }
+        }
+    }
+
+    private boolean hasTriggerChanged(Trigger oldTrigger, Trigger newTrigger) {
+        if (oldTrigger instanceof CronTrigger && 
oldTrigger.equals(newTrigger)) {
+            CronTrigger oldCron = (CronTrigger) oldTrigger;
+            CronTrigger newCron = (CronTrigger) newTrigger;
+            return 
!oldCron.getCronExpression().equals(newCron.getCronExpression());
+        } else {
+            return !newTrigger.equals(oldTrigger);
         }
     }
 

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=989179&r1=989178&r2=989179&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
 Wed Aug 25 15:45:11 2010
@@ -39,7 +39,7 @@ import org.quartz.Trigger;
 
 /**
  * A <a href="http://activemq.apache.org/quartz.html";>Quartz Endpoint</a>
- * 
+ *
  * @version $Revision:520964 $
  */
 public class QuartzEndpoint extends DefaultEndpoint implements Service {
@@ -74,7 +74,7 @@ public class QuartzEndpoint extends Defa
             detail.setJobClass(isStateful() ? StatefulCamelJob.class : 
CamelJob.class);
         }
         if (detail.getName() == null) {
-            detail.setName(getEndpointUri());
+            detail.setName(getJobName());
         }
         getComponent().addJob(detail, trigger);
     }
@@ -85,7 +85,7 @@ public class QuartzEndpoint extends Defa
 
     /**
      * This method is invoked when a Quartz job is fired.
-     * 
+     *
      * @param jobExecutionContext the Quartz Job context
      */
     public void onJobExecute(final JobExecutionContext jobExecutionContext) 
throws JobExecutionException {
@@ -143,6 +143,14 @@ public class QuartzEndpoint extends Defa
         return "quartz://" + getTrigger().getGroup() + "/" + 
getTrigger().getName();
     }
 
+    protected String getJobName() {
+        String jobName = getEndpointUri();
+        if (jobName.contains("?")) {
+            jobName = ObjectHelper.before(jobName, "?");
+        }
+        return jobName;
+    }
+
     // Properties
     // 
-------------------------------------------------------------------------
 
@@ -195,6 +203,7 @@ public class QuartzEndpoint extends Defa
 
     // Implementation methods
     // 
-------------------------------------------------------------------------
+
     public synchronized void consumerStarted(final QuartzConsumer consumer) 
throws SchedulerException {
         ObjectHelper.notNull(trigger, "trigger");
         if (LOG.isDebugEnabled()) {

Modified: 
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/StatefulCamelJob.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/StatefulCamelJob.java?rev=989179&r1=989178&r2=989179&view=diff
==============================================================================
--- 
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/StatefulCamelJob.java
 (original)
+++ 
camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/StatefulCamelJob.java
 Wed Aug 25 15:45:11 2010
@@ -23,4 +23,6 @@ import org.quartz.StatefulJob;
  */
 public class StatefulCamelJob extends CamelJob implements StatefulJob {
 
+    private static final long serialVersionUID = 25L;
+
 }


Reply via email to