You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by js...@apache.org on 2007/03/21 17:29:41 UTC

svn commit: r520939 - in /activemq/camel/trunk/camel-core/src: main/java/org/apache/camel/builder/ main/java/org/apache/camel/processor/ test/java/org/apache/camel/ test/java/org/apache/camel/builder/

Author: jstrachan
Date: Wed Mar 21 09:29:40 2007
New Revision: 520939

URL: http://svn.apache.org/viewvc?view=rev&rev=520939
Log:
minor refactor so that the BuilderSupport can easily create endpoints and the deadLetterChannel policy and added some test cases showing how to configure the policy and redelivery policy

Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FromBuilder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/RouteBuilderTest.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java Wed Mar 21 09:29:40 2007
@@ -18,27 +18,67 @@
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
 import org.apache.camel.processor.LoggingLevel;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.util.List;
+import java.util.ArrayList;
+
 /**
  * Base class for implementation inheritance
  *
  * @version $Revision: $
  */
 public abstract class BuilderSupport<E extends Exchange> {
+    private CamelContext context;
     private ErrorHandlerBuilder<E> errorHandlerBuilder;
 
-    protected BuilderSupport() {
+    protected BuilderSupport(CamelContext context) {
+        this.context = context;
     }
 
     protected BuilderSupport(BuilderSupport<E> parent) {
+        this.context = parent.getContext();
         if (parent.errorHandlerBuilder != null) {
             this.errorHandlerBuilder = parent.errorHandlerBuilder.copy();
         }
     }
 
+    // Helper methods
+    //-------------------------------------------------------------------------
+
+    /**
+     * Resolves the given URI to an endpoint
+     */
+    public Endpoint<E> endpoint(String uri) {
+        return getContext().resolveEndpoint(uri);
+    }
+
+    /**
+     * Resolves the list of URIs into a list of {@link Endpoint} instances
+     */
+    public List<Endpoint<E>> endpoints(String... uris) {
+        List<Endpoint<E>> endpoints = new ArrayList<Endpoint<E>>();
+        for (String uri : uris) {
+            endpoints.add(endpoint(uri));
+        }
+        return endpoints;
+    }
+
+    /**
+     * Helper method to create a list of {@link Endpoint} instances
+     */
+    public List<Endpoint<E>> endpoints(Endpoint<E>... endpoints) {
+        List<Endpoint<E>> answer = new ArrayList<Endpoint<E>>();
+        for (Endpoint<E> endpoint : endpoints) {
+            answer.add(endpoint);
+        }
+        return answer;
+    }
+
     // Builder methods
     //-------------------------------------------------------------------------
 
@@ -117,14 +157,27 @@
         return new LoggingErrorHandlerBuilder<E>(log, level);
     }
 
-    /*
     public DeadLetterChannelBuilder<E> deadLetterChannel() {
         return new DeadLetterChannelBuilder<E>();
     }
-    */
+
+    public DeadLetterChannelBuilder<E> deadLetterChannel(String deadLetterUri) {
+        return deadLetterChannel(endpoint(deadLetterUri));
+    }
+
+    public DeadLetterChannelBuilder<E> deadLetterChannel(Endpoint<E> deadLetterEndpoint) {
+        return new DeadLetterChannelBuilder<E>(deadLetterEndpoint);
+    }
 
     // Properties
     //-------------------------------------------------------------------------
+    public CamelContext getContext() {
+        return context;
+    }
+
+    public void setContext(CamelContext context) {
+        this.context = context;
+    }
 
     public ErrorHandlerBuilder<E> getErrorHandlerBuilder() {
         if (errorHandlerBuilder == null) {
@@ -139,4 +192,5 @@
     public void setErrorHandlerBuilder(ErrorHandlerBuilder<E> errorHandlerBuilder) {
         this.errorHandlerBuilder = errorHandlerBuilder;
     }
+
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java Wed Mar 21 09:29:40 2007
@@ -18,18 +18,18 @@
 package org.apache.camel.builder;
 
 import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
 import org.apache.camel.Expression;
-import org.apache.camel.processor.RedeliveryPolicy;
+import org.apache.camel.Processor;
 import org.apache.camel.processor.DeadLetterChannel;
 import org.apache.camel.processor.RecipientList;
+import org.apache.camel.processor.RedeliveryPolicy;
 
 /**
  * A builder of a <a href="http://activemq.apache.org/camel/dead-letter-channel.html">Dead Letter Channel</a>
- * 
+ *
  * @version $Revision$
  */
-public class DeadLetterChannelBuilder<E extends Exchange> extends BuilderSupport<E> implements ErrorHandlerBuilder<E> {
+public class DeadLetterChannelBuilder<E extends Exchange> implements ErrorHandlerBuilder<E> {
     private RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
     private ProcessorFactory<E> deadLetterFactory;
     private Processor<E> defaultDeadLetterEndpoint;
@@ -39,6 +39,10 @@
     public DeadLetterChannelBuilder() {
     }
 
+    public DeadLetterChannelBuilder(Processor<E> processor) {
+        this(new ConstantProcessorBuilder<E>(processor));
+    }
+
     public DeadLetterChannelBuilder(ProcessorFactory<E> deadLetterFactory) {
         this.deadLetterFactory = deadLetterFactory;
     }
@@ -54,6 +58,40 @@
         return new DeadLetterChannel<E>(processor, deadLetter, getRedeliveryPolicy());
     }
 
+    // Builder methods
+    //-------------------------------------------------------------------------
+    public DeadLetterChannelBuilder<E> backOffMultiplier(double backOffMultiplier) {
+        getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
+        return this;
+    }
+
+    public DeadLetterChannelBuilder<E> collisionAvoidancePercent(short collisionAvoidancePercent) {
+        getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
+        return this;
+    }
+
+    public DeadLetterChannelBuilder<E> initialRedeliveryDelay(long initialRedeliveryDelay) {
+        getRedeliveryPolicy().initialRedeliveryDelay(initialRedeliveryDelay);
+        return this;
+    }
+
+    public DeadLetterChannelBuilder<E> maximumRedeliveries(int maximumRedeliveries) {
+        getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
+        return this;
+    }
+
+    public DeadLetterChannelBuilder<E> useCollisionAvoidance() {
+        getRedeliveryPolicy().useCollisionAvoidance();
+        return this;
+    }
+
+    public DeadLetterChannelBuilder<E> useExponentialBackOff() {
+        getRedeliveryPolicy().useExponentialBackOff();
+        return this;
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
     public RedeliveryPolicy getRedeliveryPolicy() {
         return redeliveryPolicy;
     }
@@ -83,19 +121,19 @@
         this.deadLetterFactory = deadLetterFactory;
     }
 
-     public Processor<E> getDefaultDeadLetterEndpoint() {
-         if (defaultDeadLetterEndpoint == null) {
+    public Processor<E> getDefaultDeadLetterEndpoint() {
+        if (defaultDeadLetterEndpoint == null) {
             defaultDeadLetterEndpoint = new RecipientList<E>(getDefaultDeadLetterEndpointExpression());
-         }
-         return defaultDeadLetterEndpoint;
-     }
-
-     /**
-      * Sets the default dead letter endpoint used
-      */
-     public void setDefaultDeadLetterEndpoint(Processor<E> defaultDeadLetterEndpoint) {
-         this.defaultDeadLetterEndpoint = defaultDeadLetterEndpoint;
-     }
+        }
+        return defaultDeadLetterEndpoint;
+    }
+
+    /**
+     * Sets the default dead letter endpoint used
+     */
+    public void setDefaultDeadLetterEndpoint(Processor<E> defaultDeadLetterEndpoint) {
+        this.defaultDeadLetterEndpoint = defaultDeadLetterEndpoint;
+    }
 
     public Expression<E> getDefaultDeadLetterEndpointExpression() {
         if (defaultDeadLetterEndpointExpression == null) {

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FromBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FromBuilder.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FromBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FromBuilder.java Wed Mar 21 09:29:40 2007
@@ -52,29 +52,6 @@
     }
 
     /**
-     * Resolves the given URI to an endpoint
-     */
-    public Endpoint<E> endpoint(String uri) {
-        return getBuilder().endpoint(uri);
-    }
-
-    public List<Endpoint<E>> endpoints(String... uris) {
-        List<Endpoint<E>> endpoints = new ArrayList<Endpoint<E>>();
-        for (String uri : uris) {
-            endpoints.add(endpoint(uri));
-        }
-        return endpoints;
-    }
-
-    public List<Endpoint<E>> endpoints(Endpoint<E>... uris) {
-        List<Endpoint<E>> endpoints = new ArrayList<Endpoint<E>>();
-        for (Endpoint<E> uri : uris) {
-            endpoints.add(uri);
-        }
-        return endpoints;
-    }
-
-    /**
      * Sends the exchange to the given endpoint URI
      */
     public ProcessorFactory<E> to(String uri) {

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java Wed Mar 21 09:29:40 2007
@@ -30,7 +30,7 @@
  * 
  * @version $Revision$
  */
-public class LoggingErrorHandlerBuilder<E extends Exchange> extends BuilderSupport<E> implements ErrorHandlerBuilder<E> {
+public class LoggingErrorHandlerBuilder<E extends Exchange> implements ErrorHandlerBuilder<E> {
     private Log log = LogFactory.getLog(Logger.class);
     private LoggingLevel level = LoggingLevel.INFO;
 

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java Wed Mar 21 09:29:40 2007
@@ -29,7 +29,7 @@
  *
  * @version $Revision$
  */
-public class NoErrorHandlerBuilder<E extends Exchange> extends BuilderSupport<E> implements ErrorHandlerBuilder<E> {
+public class NoErrorHandlerBuilder<E extends Exchange> implements ErrorHandlerBuilder<E> {
     public ErrorHandlerBuilder<E> copy() {
         return this;
     }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java Wed Mar 21 09:29:40 2007
@@ -35,16 +35,16 @@
  * @version $Revision$
  */
 public abstract class RouteBuilder<E extends Exchange> extends BuilderSupport<E> {
-    private CamelContext<E> context;
     private List<FromBuilder<E>> fromBuilders = new ArrayList<FromBuilder<E>>();
     private AtomicBoolean initalized = new AtomicBoolean(false);
     private Map<Endpoint<E>, Processor<E>> routeMap = new HashMap<Endpoint<E>, Processor<E>>();
 
     protected RouteBuilder() {
+        this(null);
     }
 
     protected RouteBuilder(CamelContext<E> context) {
-        this.context = context;
+        super(context);
     }
 
     /**
@@ -83,17 +83,15 @@
 
     // Properties
     //-----------------------------------------------------------------------
-
     public CamelContext<E> getContext() {
+        CamelContext<E> context = super.getContext();
         if (context == null) {
             context = createContainer();
+            setContext(context);
         }
         return context;
     }
 
-    public void setContext(CamelContext<E> context) {
-        this.context = context;
-    }
 
     /**
      * Returns the routing map from inbound endpoints to processors

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java Wed Mar 21 09:29:40 2007
@@ -18,6 +18,7 @@
 package org.apache.camel.processor;
 
 import java.util.Random;
+import java.io.Serializable;
 
 // Code taken from the ActiveMQ codebase
 
@@ -27,7 +28,9 @@
  *
  * @version $Revision$
  */
-public class RedeliveryPolicy {
+public class RedeliveryPolicy implements Cloneable, Serializable {
+    protected static transient Random randomNumberGenerator;
+
     protected int maximumRedeliveries = 6;
     protected long initialRedeliveryDelay = 1000L;
     protected double backOffMultiplier = 2;
@@ -35,7 +38,7 @@
     // +/-15% for a 30% spread -cgs
     protected double collisionAvoidanceFactor = 0.15d;
     protected boolean useCollisionAvoidance = false;
-    protected static Random randomNumberGenerator;
+
 
     public RedeliveryPolicy() {
     }
@@ -186,15 +189,13 @@
         }
 
         if (useCollisionAvoidance) {
-            if (randomNumberGenerator == null) {
-                initRandomNumberGenerator();
-            }
 
             /*
              * First random determines +/-, second random determines how far to
              * go in that direction. -cgs
              */
-            double variance = (randomNumberGenerator.nextBoolean() ? collisionAvoidanceFactor : -collisionAvoidanceFactor) * randomNumberGenerator.nextDouble();
+            Random random = getRandomNumberGenerator();
+            double variance = (random.nextBoolean() ? collisionAvoidanceFactor : -collisionAvoidanceFactor) * random.nextDouble();
             redeliveryDelay += redeliveryDelay * variance;
         }
 
@@ -223,9 +224,10 @@
         this.useExponentialBackOff = useExponentialBackOff;
     }
 
-    protected static synchronized void initRandomNumberGenerator() {
+    protected static synchronized Random getRandomNumberGenerator() {
         if (randomNumberGenerator == null) {
             randomNumberGenerator = new Random();
         }
+        return randomNumberGenerator;
     }
 }

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java Wed Mar 21 09:29:40 2007
@@ -36,4 +36,8 @@
                 expectedType.isInstance(value));
         return expectedType.cast(value);
     }
+
+    protected void assertEndpointUri(Endpoint<Exchange> endpoint, String uri) {
+        assertEquals("Endoint uri for: " + endpoint, uri, endpoint.getEndpointUri());
+    }
 }

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java Wed Mar 21 09:29:40 2007
@@ -25,6 +25,7 @@
 import org.apache.camel.processor.LoggingErrorHandler;
 import org.apache.camel.processor.SendProcessor;
 import org.apache.camel.processor.DeadLetterChannel;
+import org.apache.camel.processor.RedeliveryPolicy;
 
 import java.util.Map;
 import java.util.Set;
@@ -97,4 +98,62 @@
             }
         }
     }
+
+    public void testConfigureDeadLetterChannel() throws Exception {
+
+        // START SNIPPET: e3
+        RouteBuilder<Exchange> builder1 = new RouteBuilder<Exchange>() {
+            public void configure() {
+                errorHandler(deadLetterChannel("queue:errors"));
+
+                from("queue:a").to("queue:b");
+            }
+        };
+        // END SNIPPET: e3
+        RouteBuilder<Exchange> builder = builder1;
+
+        Map<Endpoint<Exchange>, Processor<Exchange>> routeMap = builder.getRouteMap();
+        Set<Map.Entry<Endpoint<Exchange>, Processor<Exchange>>> routes = routeMap.entrySet();
+        assertEquals("Number routes created", 1, routes.size());
+        for (Map.Entry<Endpoint<Exchange>, Processor<Exchange>> route : routes) {
+            Endpoint<Exchange> key = route.getKey();
+            assertEquals("From endpoint", "queue:a", key.getEndpointUri());
+            Processor processor = route.getValue();
+
+            DeadLetterChannel deadLetterChannel = assertIsInstanceOf(DeadLetterChannel.class, processor);
+            Endpoint deadLetterEndpoint = assertIsInstanceOf(Endpoint.class, deadLetterChannel.getDeadLetter());
+            assertEndpointUri(deadLetterEndpoint, "queue:errors");
+        }
+    }
+
+    public void testConfigureDeadLetterChannelWithCustomRedeliveryPolicy() throws Exception {
+
+        // START SNIPPET: e4
+        RouteBuilder<Exchange> builder1 = new RouteBuilder<Exchange>() {
+            public void configure() {
+                errorHandler(deadLetterChannel("queue:errors").maximumRedeliveries(2).useExponentialBackOff());
+
+                from("queue:a").to("queue:b");
+            }
+        };
+        // END SNIPPET: e4
+        RouteBuilder<Exchange> builder = builder1;
+
+        Map<Endpoint<Exchange>, Processor<Exchange>> routeMap = builder.getRouteMap();
+        Set<Map.Entry<Endpoint<Exchange>, Processor<Exchange>>> routes = routeMap.entrySet();
+        assertEquals("Number routes created", 1, routes.size());
+        for (Map.Entry<Endpoint<Exchange>, Processor<Exchange>> route : routes) {
+            Endpoint<Exchange> key = route.getKey();
+            assertEquals("From endpoint", "queue:a", key.getEndpointUri());
+            Processor processor = route.getValue();
+
+            DeadLetterChannel deadLetterChannel = assertIsInstanceOf(DeadLetterChannel.class, processor);
+            Endpoint deadLetterEndpoint = assertIsInstanceOf(Endpoint.class, deadLetterChannel.getDeadLetter());
+            assertEndpointUri(deadLetterEndpoint, "queue:errors");
+            RedeliveryPolicy redeliveryPolicy = deadLetterChannel.getRedeliveryPolicy();
+            assertEquals("getMaximumRedeliveries()", 2, redeliveryPolicy.getMaximumRedeliveries());
+            assertEquals("isUseExponentialBackOff()", true, redeliveryPolicy.isUseExponentialBackOff());
+        }
+    }
+
 }

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/RouteBuilderTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/RouteBuilderTest.java?view=diff&rev=520939&r1=520938&r2=520939
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/RouteBuilderTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/RouteBuilderTest.java Wed Mar 21 09:29:40 2007
@@ -416,8 +416,4 @@
         DeadLetterChannel deadLetter = (DeadLetterChannel) processor;
         return deadLetter.getOutput();
     }
-
-    protected void assertEndpointUri(Endpoint<Exchange> endpoint, String uri) {
-        assertEquals("Endoint uri for: " + endpoint, uri, endpoint.getEndpointUri());
-    }
 }