Author: ningjiang Date: Thu May 13 04:14:24 2010 New Revision: 943792 URL: http://svn.apache.org/viewvc?rev=943792&view=rev Log: CAMEL-2710, CAMEL-1717 Added ignoreInvalidEndpoints options on RoutingSlip
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipIgnoreInvalidEndpointsTest.java (with props) Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipDataModificationTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java?rev=943792&r1=943791&r2=943792&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java Thu May 13 04:14:24 2010 @@ -1271,6 +1271,48 @@ public abstract class ProcessorDefinitio addOutput(answer); return (Type) this; } + + /** + * <a href="http://camel.apache.org/routing-slip.html">Routing Slip EIP:</a> + * Creates a routing slip allowing you to route a message consecutively through a series of processing + * steps where the sequence of steps is not known at design time and can vary for each message. + * + * @param header is the header that the {...@link org.apache.camel.processor.RoutingSlip RoutingSlip} + * class will look in for the list of URIs to route the message to. + * @param uriDelimiter is the delimiter that will be used to split up + * the list of URIs in the routing slip. + * @param ignoreInvalidEndpoints if this parameter is true, routingSlip will ignore the endpoints which + * cannot be resolved or a producer cannot be created or started + * @return the builder + */ + @SuppressWarnings("unchecked") + public Type routingSlip(String header, String uriDelimiter, boolean ignoreInvalidEndpoints) { + RoutingSlipDefinition answer = new RoutingSlipDefinition(header, uriDelimiter); + answer.setIgnoreInvalidEndpoints(ignoreInvalidEndpoints); + addOutput(answer); + return (Type) this; + } + + /** + * <a href="http://camel.apache.org/routing-slip.html">Routing Slip EIP:</a> + * Creates a routing slip allowing you to route a message consecutively through a series of processing + * steps where the sequence of steps is not known at design time and can vary for each message. + * <p> + * The list of URIs will be split based on the default delimiter {...@link RoutingSlipDefinition#DEFAULT_DELIMITER} + * + * @param header is the header that the {...@link org.apache.camel.processor.RoutingSlip RoutingSlip} + * class will look in for the list of URIs to route the message to. + * @param ignoreInvalidEndpoints if this parameter is true, routingSlip will ignore the endpoints which + * cannot be resolved or a producer cannot be created or started + * @return the builder + */ + @SuppressWarnings("unchecked") + public Type routingSlip(String header, boolean ignoreInvalidEndpoints) { + RoutingSlipDefinition answer = new RoutingSlipDefinition(header); + answer.setIgnoreInvalidEndpoints(ignoreInvalidEndpoints); + addOutput(answer); + return (Type) this; + } /** * <a href="http://camel.apache.org/sampling.html">Sampling Throttler</a> Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java?rev=943792&r1=943791&r2=943792&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java Thu May 13 04:14:24 2010 @@ -41,6 +41,8 @@ public class RoutingSlipDefinition exten private String headerName; @XmlAttribute private String uriDelimiter; + @XmlAttribute + private Boolean ignoreInvalidEndpoints; public RoutingSlipDefinition() { this(null, DEFAULT_DELIMITER); @@ -69,7 +71,11 @@ public class RoutingSlipDefinition exten public Processor createProcessor(RouteContext routeContext) throws Exception { ObjectHelper.notEmpty(getHeaderName(), "headerName", this); ObjectHelper.notEmpty(getUriDelimiter(), "uriDelimiter", this); - return new RoutingSlip(routeContext.getCamelContext(), getHeaderName(), getUriDelimiter()); + RoutingSlip routingSlip = new RoutingSlip(routeContext.getCamelContext(), getHeaderName(), getUriDelimiter()); + if (getIgnoreInvalidEndpoint() != null) { + routingSlip.setIgnoreInvalidEndpoints(getIgnoreInvalidEndpoint()); + } + return routingSlip; } @Override @@ -92,4 +98,12 @@ public class RoutingSlipDefinition exten public String getUriDelimiter() { return uriDelimiter; } + + public void setIgnoreInvalidEndpoints(Boolean ignoreInvalidEndpoints) { + this.ignoreInvalidEndpoints = ignoreInvalidEndpoints; + } + + public Boolean getIgnoreInvalidEndpoint() { + return ignoreInvalidEndpoints; + } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java?rev=943792&r1=943791&r2=943792&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java Thu May 13 04:14:24 2010 @@ -59,7 +59,7 @@ public abstract class RedeliveryErrorHan Processor failureProcessor; Processor onRedeliveryProcessor = redeliveryProcessor; Predicate handledPredicate = handledPolicy; - Predicate continuedPredicate = null; + Predicate continuedPredicate; boolean useOriginalInMessage = useOriginalMessagePolicy; } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java?rev=943792&r1=943791&r2=943792&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java Thu May 13 04:14:24 2010 @@ -20,6 +20,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; +import org.apache.camel.FailedToCreateProducerException; import org.apache.camel.Message; import org.apache.camel.Processor; import org.apache.camel.Producer; @@ -44,6 +45,7 @@ import static org.apache.camel.util.Obje public class RoutingSlip extends ServiceSupport implements Processor, Traceable { private static final transient Log LOG = LogFactory.getLog(RoutingSlip.class); private ProducerCache producerCache; + private boolean ignoreInvalidEndpoints; private final String header; private final String uriDelimiter; private final CamelContext camelContext; @@ -61,6 +63,14 @@ public class RoutingSlip extends Service this.header = header; this.uriDelimiter = uriDelimiter; } + + public boolean isIgnoreInvalidEndpoints() { + return ignoreInvalidEndpoints; + } + + public void setIgnoreInvalidEndpoints(boolean ignoreInvalidEndpoints) { + this.ignoreInvalidEndpoints = ignoreInvalidEndpoints; + } @Override public String toString() { @@ -81,7 +91,17 @@ public class RoutingSlip extends Service Exchange current = exchange; for (String nextRecipient : recipients) { - Endpoint endpoint = resolveEndpoint(exchange, nextRecipient); + Endpoint endpoint = null; + try { + endpoint = resolveEndpoint(exchange, nextRecipient.trim()); + } catch (Exception ex) { + if (isIgnoreInvalidEndpoints()) { + LOG.info("Cannot resolve the endpoint with " + nextRecipient, ex); + continue; + } else { + throw ex; + } + } Exchange copy = new DefaultExchange(current); updateRoutingSlip(current); @@ -97,8 +117,14 @@ public class RoutingSlip extends Service } }); } catch (Exception e) { - // catch exception so we can decide if we want to continue or not - copy.setException(e); + // Need to check the if the exception is thrown when camel try to create and start the producer + if (e instanceof FailedToCreateProducerException && isIgnoreInvalidEndpoints()) { + LOG.info("An Invalid endpoint with " + nextRecipient, e); + continue; + } else { + // catch exception so we can decide if we want to continue or not + copy.setException(e); + } } finally { current = copy; } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipDataModificationTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipDataModificationTest.java?rev=943792&r1=943791&r2=943792&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipDataModificationTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipDataModificationTest.java Thu May 13 04:14:24 2010 @@ -23,13 +23,10 @@ import org.apache.camel.ContextTestSuppo import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.util.jndi.JndiContext; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; public class RoutingSlipDataModificationTest extends ContextTestSupport { protected static final String ANSWER = "answer"; protected static final String ROUTING_SLIP_HEADER = "routingSlipHeader"; - private static final transient Log LOG = LogFactory.getLog(RoutingSlipDataModificationTest.class); protected MyBean myBean = new MyBean(); public void testModificationOfDataAlongRoute() @@ -47,7 +44,7 @@ public class RoutingSlipDataModification protected void sendBody() { template.sendBodyAndHeader("direct:a", ANSWER, ROUTING_SLIP_HEADER, - "mock:x,bean:myBean?method=modifyData"); + "mock:x , bean:myBean?method=modifyData"); } @Override Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipIgnoreInvalidEndpointsTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipIgnoreInvalidEndpointsTest.java?rev=943792&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipIgnoreInvalidEndpointsTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipIgnoreInvalidEndpointsTest.java Thu May 13 04:14:24 2010 @@ -0,0 +1,65 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.processor.routingslip; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.ResolveEndpointFailedException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; + +public class RoutingSlipIgnoreInvalidEndpointsTest extends ContextTestSupport { + + public void testEndpontResolvedFailedWithIgnoreInvalidEndpoints() throws Exception { + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedBodiesReceived("Hello World"); + MockEndpoint end = getMockEndpoint("mock:end"); + end.expectedBodiesReceived("Hello World"); + + template.sendBodyAndHeader("direct:a", "Hello", "myHeader", "direct:start ,fail:endpoint, mock:result"); + + assertMockEndpointsSatisfied(); + } + + public void testEndpointResolvedFailedWithoutIgnoreInvalidEndpoints() throws Exception { + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(0); + MockEndpoint end = getMockEndpoint("mock:end"); + end.expectedMessageCount(0); + try { + template.sendBodyAndHeader("direct:b", "Hello", "myHeader", "direct:start,fail:endpoint,mock:result"); + fail("Expect the exception here."); + } catch (Exception ex) { + assertTrue("Get a wrong cause of the exception", ex.getCause() instanceof ResolveEndpointFailedException); + } + assertMockEndpointsSatisfied(); + } + + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + public void configure() { + from("direct:a").routingSlip("myHeader", true).to("mock:end"); + + from("direct:b").routingSlip("myHeader").to("mock:end"); + + from("direct:start").transform(constant("Hello World")); + } + + }; + } + +} + Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipIgnoreInvalidEndpointsTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipIgnoreInvalidEndpointsTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date