Author: davsclaus Date: Sat Feb 12 12:04:33 2011 New Revision: 1070059 URL: http://svn.apache.org/viewvc?rev=1070059&view=rev Log: CAMEL-3658: redelivery policy supports property placeholders.
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java - copied, changed from r1070041, camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml - copied, changed from r1070041, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java?rev=1070059&r1=1070058&r2=1070059&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java Sat Feb 12 12:04:33 2011 @@ -339,6 +339,17 @@ public class OnExceptionDefinition exten } /** + * Sets the back off multiplier (supports property placeholders) + * + * @param backOffMultiplier the back off multiplier + * @return the builder + */ + public OnExceptionDefinition backOffMultiplier(String backOffMultiplier) { + getOrCreateRedeliveryPolicy().backOffMultiplier(backOffMultiplier); + return this; + } + + /** * Sets the collision avoidance factor * * @param collisionAvoidanceFactor the factor @@ -350,6 +361,17 @@ public class OnExceptionDefinition exten } /** + * Sets the collision avoidance factor (supports property placeholders) + * + * @param collisionAvoidanceFactor the factor + * @return the builder + */ + public OnExceptionDefinition collisionAvoidanceFactor(String collisionAvoidanceFactor) { + getOrCreateRedeliveryPolicy().collisionAvoidanceFactor(collisionAvoidanceFactor); + return this; + } + + /** * Sets the collision avoidance percentage * * @param collisionAvoidancePercent the percentage @@ -372,13 +394,24 @@ public class OnExceptionDefinition exten } /** + * Sets the initial redelivery delay (supports property placeholders) + * + * @param delay delay in millis + * @return the builder + */ + public OnExceptionDefinition redeliveryDelay(String delay) { + getOrCreateRedeliveryPolicy().redeliveryDelay(delay); + return this; + } + + /** * Allow synchronous delayed redelivery. * * @see org.apache.camel.processor.RedeliveryPolicy#setAsyncDelayedRedelivery(boolean) * @return the builder */ public OnExceptionDefinition asyncDelayedRedelivery() { - getOrCreateRedeliveryPolicy().setAsyncDelayedRedelivery(true); + getOrCreateRedeliveryPolicy().asyncDelayedRedelivery(); return this; } @@ -408,7 +441,15 @@ public class OnExceptionDefinition exten * Sets whether to log stacktrace for failed messages. */ public OnExceptionDefinition logStackTrace(boolean logStackTrace) { - getOrCreateRedeliveryPolicy().setLogStackTrace(logStackTrace); + getOrCreateRedeliveryPolicy().logStackTrace(logStackTrace); + return this; + } + + /** + * Sets whether to log stacktrace for failed messages (supports property placeholders) + */ + public OnExceptionDefinition logStackTrace(String logStackTrace) { + getOrCreateRedeliveryPolicy().logStackTrace(logStackTrace); return this; } @@ -416,7 +457,15 @@ public class OnExceptionDefinition exten * Sets whether to log stacktrace for failed redelivery attempts */ public OnExceptionDefinition logRetryStackTrace(boolean logRetryStackTrace) { - getOrCreateRedeliveryPolicy().setLogRetryStackTrace(logRetryStackTrace); + getOrCreateRedeliveryPolicy().logRetryStackTrace(logRetryStackTrace); + return this; + } + + /** + * Sets whether to log stacktrace for failed redelivery attempts (supports property placeholders) + */ + public OnExceptionDefinition logRetryStackTrace(String logRetryStackTrace) { + getOrCreateRedeliveryPolicy().logRetryStackTrace(logRetryStackTrace); return this; } @@ -424,7 +473,15 @@ public class OnExceptionDefinition exten * Sets whether to log errors even if its handled */ public OnExceptionDefinition logHandled(boolean logHandled) { - getOrCreateRedeliveryPolicy().setLogHandled(logHandled); + getOrCreateRedeliveryPolicy().logHandled(logHandled); + return this; + } + + /** + * Sets whether to log errors even if its handled (supports property placeholders) + */ + public OnExceptionDefinition logHandled(String logHandled) { + getOrCreateRedeliveryPolicy().logHandled(logHandled); return this; } @@ -432,7 +489,15 @@ public class OnExceptionDefinition exten * Sets whether to log errors even if its continued */ public OnExceptionDefinition logContinued(boolean logContinued) { - getOrCreateRedeliveryPolicy().setLogContinued(logContinued); + getOrCreateRedeliveryPolicy().logContinued(logContinued); + return this; + } + + /** + * Sets whether to log errors even if its continued (supports property placeholders) + */ + public OnExceptionDefinition logContinued(String logContinued) { + getOrCreateRedeliveryPolicy().logContinued(logContinued); return this; } @@ -440,7 +505,15 @@ public class OnExceptionDefinition exten * Sets whether to log retry attempts */ public OnExceptionDefinition logRetryAttempted(boolean logRetryAttempted) { - getOrCreateRedeliveryPolicy().setLogRetryAttempted(logRetryAttempted); + getOrCreateRedeliveryPolicy().logRetryAttempted(logRetryAttempted); + return this; + } + + /** + * Sets whether to log retry attempts (supports property placeholders) + */ + public OnExceptionDefinition logRetryAttempted(String logRetryAttempted) { + getOrCreateRedeliveryPolicy().logRetryAttempted(logRetryAttempted); return this; } @@ -448,7 +521,15 @@ public class OnExceptionDefinition exten * Sets whether to log exhausted exceptions */ public OnExceptionDefinition logExhausted(boolean logExhausted) { - getOrCreateRedeliveryPolicy().setLogExhausted(logExhausted); + getOrCreateRedeliveryPolicy().logExhausted(logExhausted); + return this; + } + + /** + * Sets whether to log exhausted exceptions (supports property placeholders) + */ + public OnExceptionDefinition logExhausted(String logExhausted) { + getOrCreateRedeliveryPolicy().logExhausted(logExhausted); return this; } @@ -469,6 +550,22 @@ public class OnExceptionDefinition exten } /** + * Sets the maximum redeliveries (supports property placeholders) + * <ul> + * <li>5 = default value</li> + * <li>0 = no redeliveries</li> + * <li>-1 = redeliver forever</li> + * </ul> + * + * @param maximumRedeliveries the value + * @return the builder + */ + public OnExceptionDefinition maximumRedeliveries(String maximumRedeliveries) { + getOrCreateRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries); + return this; + } + + /** * Turn on collision avoidance. * * @return the builder @@ -500,6 +597,17 @@ public class OnExceptionDefinition exten } /** + * Sets the maximum delay between redelivery (supports property placeholders) + * + * @param maximumRedeliveryDelay the delay in millis + * @return the builder + */ + public OnExceptionDefinition maximumRedeliveryDelay(String maximumRedeliveryDelay) { + getOrCreateRedeliveryPolicy().maximumRedeliveryDelay(maximumRedeliveryDelay); + return this; + } + + /** * Sets a reference to a {@link RedeliveryPolicy} to lookup in the {@link org.apache.camel.spi.Registry} to be used. * * @param redeliveryPolicyRef reference to use for lookup @@ -689,9 +797,9 @@ public class OnExceptionDefinition exten this.useOriginalMessagePolicy = useOriginalMessagePolicy; } - public boolean isAsyncDelayedRedelivery() { - if (getRedeliveryPolicy() != null) { - return getRedeliveryPolicy().getAsyncDelayedRedelivery() != null && getRedeliveryPolicy().getAsyncDelayedRedelivery(); + public boolean isAsyncDelayedRedelivery(CamelContext context) { + if (getRedeliveryPolicy() != null ) { + return getRedeliveryPolicy().isAsyncDelayedRedelivery(context); } return false; } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java?rev=1070059&r1=1070058&r2=1070059&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java Sat Feb 12 12:04:33 2011 @@ -25,6 +25,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.LoggingLevel; import org.apache.camel.processor.RedeliveryPolicy; import org.apache.camel.util.CamelContextHelper; +import org.apache.camel.util.ObjectHelper; /** * Represents an XML <redeliveryPolicy/> element @@ -34,42 +35,42 @@ import org.apache.camel.util.CamelContex @XmlRootElement(name = "redeliveryPolicy") @XmlAccessorType(XmlAccessType.FIELD) public class RedeliveryPolicyDefinition { - @XmlAttribute() + @XmlAttribute private String ref; @XmlAttribute - private Integer maximumRedeliveries; + private String maximumRedeliveries; @XmlAttribute - private Long redeliveryDelay; + private String redeliveryDelay; @XmlAttribute - private Boolean asyncDelayedRedelivery; + private String asyncDelayedRedelivery; @XmlAttribute - private Double backOffMultiplier; + private String backOffMultiplier; @XmlAttribute - private Boolean useExponentialBackOff; + private String useExponentialBackOff; @XmlAttribute - private Double collisionAvoidanceFactor; + private String collisionAvoidanceFactor; @XmlAttribute - private Boolean useCollisionAvoidance; + private String useCollisionAvoidance; @XmlAttribute - private Long maximumRedeliveryDelay; + private String maximumRedeliveryDelay; @XmlAttribute private LoggingLevel retriesExhaustedLogLevel; @XmlAttribute private LoggingLevel retryAttemptedLogLevel; @XmlAttribute - private Boolean logRetryAttempted; + private String logRetryAttempted; @XmlAttribute - private Boolean logStackTrace; + private String logStackTrace; @XmlAttribute - private Boolean logRetryStackTrace; + private String logRetryStackTrace; @XmlAttribute - private Boolean logHandled; + private String logHandled; @XmlAttribute - private Boolean logContinued; + private String logContinued; @XmlAttribute - private Boolean logExhausted; + private String logExhausted; @XmlAttribute - private Boolean disableRedelivery; + private String disableRedelivery; @XmlAttribute private String delayPattern; @@ -86,60 +87,69 @@ public class RedeliveryPolicyDefinition answer = new RedeliveryPolicy(); } - // copy across the properties - if they are set - if (maximumRedeliveries != null) { - answer.setMaximumRedeliveries(maximumRedeliveries); - } - if (redeliveryDelay != null) { - answer.setRedeliveryDelay(redeliveryDelay); - } - if (asyncDelayedRedelivery != null && asyncDelayedRedelivery) { - answer.asyncDelayedRedelivery(); - } - if (retriesExhaustedLogLevel != null) { - answer.setRetriesExhaustedLogLevel(retriesExhaustedLogLevel); - } - if (retryAttemptedLogLevel != null) { - answer.setRetryAttemptedLogLevel(retryAttemptedLogLevel); - } - if (backOffMultiplier != null) { - answer.setBackOffMultiplier(backOffMultiplier); - } - if (useExponentialBackOff != null) { - answer.setUseExponentialBackOff(useExponentialBackOff); - } - if (collisionAvoidanceFactor != null) { - answer.setCollisionAvoidanceFactor(collisionAvoidanceFactor); - } - if (useCollisionAvoidance != null) { - answer.setUseCollisionAvoidance(useCollisionAvoidance); - } - if (maximumRedeliveryDelay != null) { - answer.setMaximumRedeliveryDelay(maximumRedeliveryDelay); - } - if (logStackTrace != null) { - answer.setLogStackTrace(logStackTrace); - } - if (logRetryStackTrace != null) { - answer.setLogRetryStackTrace(logRetryStackTrace); - } - if (logHandled != null) { - answer.setLogHandled(logHandled); - } - if (logContinued != null) { - answer.setLogContinued(logContinued); - } - if (logRetryAttempted != null) { - answer.setLogRetryAttempted(logRetryAttempted); - } - if (logExhausted != null) { - answer.setLogExhausted(logExhausted); - } - if (disableRedelivery != null && disableRedelivery) { - answer.setMaximumRedeliveries(0); - } - if (delayPattern != null) { - answer.setDelayPattern(delayPattern); + try { + + // copy across the properties - if they are set + if (maximumRedeliveries != null) { + answer.setMaximumRedeliveries(CamelContextHelper.parseInteger(context, maximumRedeliveries)); + } + if (redeliveryDelay != null) { + answer.setRedeliveryDelay(CamelContextHelper.parseLong(context, redeliveryDelay)); + } + if (asyncDelayedRedelivery != null) { + if (CamelContextHelper.parseBoolean(context, asyncDelayedRedelivery)) { + answer.asyncDelayedRedelivery(); + } + } + if (retriesExhaustedLogLevel != null) { + answer.setRetriesExhaustedLogLevel(retriesExhaustedLogLevel); + } + if (retryAttemptedLogLevel != null) { + answer.setRetryAttemptedLogLevel(retryAttemptedLogLevel); + } + if (backOffMultiplier != null) { + answer.setBackOffMultiplier(CamelContextHelper.parseDouble(context, backOffMultiplier)); + } + if (useExponentialBackOff != null) { + answer.setUseExponentialBackOff(CamelContextHelper.parseBoolean(context, useExponentialBackOff)); + } + if (collisionAvoidanceFactor != null) { + answer.setCollisionAvoidanceFactor(CamelContextHelper.parseDouble(context, collisionAvoidanceFactor)); + } + if (useCollisionAvoidance != null) { + answer.setUseCollisionAvoidance(CamelContextHelper.parseBoolean(context, useCollisionAvoidance)); + } + if (maximumRedeliveryDelay != null) { + answer.setMaximumRedeliveryDelay(CamelContextHelper.parseLong(context, maximumRedeliveryDelay)); + } + if (logStackTrace != null) { + answer.setLogStackTrace(CamelContextHelper.parseBoolean(context, logStackTrace)); + } + if (logRetryStackTrace != null) { + answer.setLogRetryStackTrace(CamelContextHelper.parseBoolean(context, logRetryStackTrace)); + } + if (logHandled != null) { + answer.setLogHandled(CamelContextHelper.parseBoolean(context, logHandled)); + } + if (logContinued != null) { + answer.setLogContinued(CamelContextHelper.parseBoolean(context, logContinued)); + } + if (logRetryAttempted != null) { + answer.setLogRetryAttempted(CamelContextHelper.parseBoolean(context, logRetryAttempted)); + } + if (logExhausted != null) { + answer.setLogExhausted(CamelContextHelper.parseBoolean(context, logExhausted)); + } + if (disableRedelivery != null) { + if (CamelContextHelper.parseBoolean(context, disableRedelivery)) { + answer.setMaximumRedeliveries(0); + } + } + if (delayPattern != null) { + answer.setDelayPattern(delayPattern); + } + } catch (Exception e) { + throw ObjectHelper.wrapRuntimeCamelException(e); } return answer; @@ -151,6 +161,15 @@ public class RedeliveryPolicyDefinition // Fluent API //------------------------------------------------------------------------- + + /** + * Allow synchronous delayed redelivery. + */ + public RedeliveryPolicyDefinition asyncDelayedRedelivery() { + setAsyncDelayedRedelivery("true"); + return this; + } + /** * Sets the back off multiplier * @@ -158,6 +177,16 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition backOffMultiplier(double backOffMultiplier) { + return backOffMultiplier(Double.toString(backOffMultiplier)); + } + + /** + * Sets the back off multiplier (supports property placeholders) + * + * @param backOffMultiplier the back off multiplier + * @return the builder + */ + public RedeliveryPolicyDefinition backOffMultiplier(String backOffMultiplier) { setBackOffMultiplier(backOffMultiplier); return this; } @@ -169,7 +198,7 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition collisionAvoidancePercent(double collisionAvoidancePercent) { - setCollisionAvoidanceFactor(collisionAvoidancePercent * 0.01d); + setCollisionAvoidanceFactor(Double.toString(collisionAvoidancePercent * 0.01d)); return this; } @@ -180,6 +209,16 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition collisionAvoidanceFactor(double collisionAvoidanceFactor) { + return collisionAvoidanceFactor(Double.toString(collisionAvoidanceFactor)); + } + + /** + * Sets the collision avoidance factor (supports property placeholders) + * + * @param collisionAvoidanceFactor the factor + * @return the builder + */ + public RedeliveryPolicyDefinition collisionAvoidanceFactor(String collisionAvoidanceFactor) { setCollisionAvoidanceFactor(collisionAvoidanceFactor); return this; } @@ -191,6 +230,16 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition redeliveryDelay(long delay) { + return redeliveryDelay(Long.toString(delay)); + } + + /** + * Sets the initial redelivery delay (supports property placeholders) + * + * @param delay delay in millis + * @return the builder + */ + public RedeliveryPolicyDefinition redeliveryDelay(String delay) { setRedeliveryDelay(delay); return this; } @@ -225,6 +274,17 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition logStackTrace(boolean logStackTrace) { + return logStackTrace(Boolean.toString(logStackTrace)); + } + + /** + * Sets whether stack traces should be logged (supports property placeholders) + * Can be used to include or reduce verbose. + * + * @param logStackTrace whether stack traces should be logged or not + * @return the builder + */ + public RedeliveryPolicyDefinition logStackTrace(String logStackTrace) { setLogStackTrace(logStackTrace); return this; } @@ -237,54 +297,109 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition logRetryStackTrace(boolean logRetryStackTrace) { + return logRetryStackTrace(Boolean.toString(logRetryStackTrace)); + } + + /** + * Sets whether stack traces should be logged when an retry attempt failed (supports property placeholders). + * Can be used to include or reduce verbose. + * + * @param logRetryStackTrace whether stack traces should be logged or not + * @return the builder + */ + public RedeliveryPolicyDefinition logRetryStackTrace(String logRetryStackTrace) { setLogRetryStackTrace(logRetryStackTrace); return this; } /** - * Sets whether retry attempts should be logged or not + * Sets whether retry attempts should be logged or not. * Can be used to include or reduce verbose. * * @param logRetryAttempted whether retry attempts should be logged or not * @return the builder */ public RedeliveryPolicyDefinition logRetryAttempted(boolean logRetryAttempted) { + return logRetryAttempted(Boolean.toString(logRetryAttempted)); + } + + /** + * Sets whether retry attempts should be logged or not (supports property placeholders). + * Can be used to include or reduce verbose. + * + * @param logRetryAttempted whether retry attempts should be logged or not + * @return the builder + */ + public RedeliveryPolicyDefinition logRetryAttempted(String logRetryAttempted) { setLogRetryAttempted(logRetryAttempted); return this; } /** - * Sets whether handled exceptions should be logged or not + * Sets whether handled exceptions should be logged or not. * Can be used to include or reduce verbose. * * @param logHandled whether handled exceptions should be logged or not * @return the builder */ public RedeliveryPolicyDefinition logHandled(boolean logHandled) { + return logHandled(Boolean.toString(logHandled)); + } + + /** + * Sets whether handled exceptions should be logged or not (supports property placeholders). + * Can be used to include or reduce verbose. + * + * @param logHandled whether handled exceptions should be logged or not + * @return the builder + */ + public RedeliveryPolicyDefinition logHandled(String logHandled) { setLogHandled(logHandled); return this; } /** - * Sets whether continued exceptions should be logged or not + * Sets whether continued exceptions should be logged or not. * Can be used to include or reduce verbose. * * @param logContinued whether continued exceptions should be logged or not * @return the builder */ public RedeliveryPolicyDefinition logContinued(boolean logContinued) { + return logContinued(Boolean.toString(logContinued)); + } + + /** + * Sets whether continued exceptions should be logged or not (supports property placeholders). + * Can be used to include or reduce verbose. + * + * @param logContinued whether continued exceptions should be logged or not + * @return the builder + */ + public RedeliveryPolicyDefinition logContinued(String logContinued) { setLogContinued(logContinued); return this; } /** - * Sets whether exhausted exceptions should be logged or not + * Sets whether exhausted exceptions should be logged or not. * Can be used to include or reduce verbose. * * @param logExhausted whether exhausted exceptions should be logged or not * @return the builder */ public RedeliveryPolicyDefinition logExhausted(boolean logExhausted) { + return logExhausted(Boolean.toString(logExhausted)); + } + + /** + * Sets whether exhausted exceptions should be logged or not (supports property placeholders). + * Can be used to include or reduce verbose. + * + * @param logExhausted whether exhausted exceptions should be logged or not + * @return the builder + */ + public RedeliveryPolicyDefinition logExhausted(String logExhausted) { setLogExhausted(logExhausted); return this; } @@ -301,6 +416,21 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition maximumRedeliveries(int maximumRedeliveries) { + return maximumRedeliveries(Integer.toString(maximumRedeliveries)); + } + + /** + * Sets the maximum redeliveries (supports property placeholders) + * <ul> + * <li>x = redeliver at most x times</li> + * <li>0 = no redeliveries</li> + * <li>-1 = redeliver forever</li> + * </ul> + * + * @param maximumRedeliveries the value + * @return the builder + */ + public RedeliveryPolicyDefinition maximumRedeliveries(String maximumRedeliveries) { setMaximumRedeliveries(maximumRedeliveries); return this; } @@ -311,7 +441,7 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition useCollisionAvoidance() { - setUseCollisionAvoidance(Boolean.TRUE); + setUseCollisionAvoidance("true"); return this; } @@ -321,7 +451,7 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition useExponentialBackOff() { - setUseExponentialBackOff(Boolean.TRUE); + setUseExponentialBackOff("true"); return this; } @@ -332,6 +462,16 @@ public class RedeliveryPolicyDefinition * @return the builder */ public RedeliveryPolicyDefinition maximumRedeliveryDelay(long maximumRedeliveryDelay) { + return maximumRedeliveryDelay(Long.toString(maximumRedeliveryDelay)); + } + + /** + * Sets the maximum delay between redelivery (supports property placeholders) + * + * @param maximumRedeliveryDelay the delay in millis + * @return the builder + */ + public RedeliveryPolicyDefinition maximumRedeliveryDelay(String maximumRedeliveryDelay) { setMaximumRedeliveryDelay(maximumRedeliveryDelay); return this; } @@ -361,148 +501,160 @@ public class RedeliveryPolicyDefinition // Properties //------------------------------------------------------------------------- - public Double getBackOffMultiplier() { - return backOffMultiplier; + public String getRef() { + return ref; } - public void setBackOffMultiplier(Double backOffMultiplier) { - this.backOffMultiplier = backOffMultiplier; + public void setRef(String ref) { + this.ref = ref; } - public Double getCollisionAvoidanceFactor() { - return collisionAvoidanceFactor; + public String getMaximumRedeliveries() { + return maximumRedeliveries; } - public void setCollisionAvoidanceFactor(Double collisionAvoidanceFactor) { - this.collisionAvoidanceFactor = collisionAvoidanceFactor; + public void setMaximumRedeliveries(String maximumRedeliveries) { + this.maximumRedeliveries = maximumRedeliveries; } - public Long getRedeliveryDelay() { + public String getRedeliveryDelay() { return redeliveryDelay; } - public void setRedeliveryDelay(Long delay) { - this.redeliveryDelay = delay; + public void setRedeliveryDelay(String redeliveryDelay) { + this.redeliveryDelay = redeliveryDelay; } - public Boolean getAsyncDelayedRedelivery() { + public String getAsyncDelayedRedelivery() { return asyncDelayedRedelivery; } - public void setAsyncDelayedRedelivery(Boolean asyncDelayedRedelivery) { - this.asyncDelayedRedelivery = asyncDelayedRedelivery; - } + public boolean isAsyncDelayedRedelivery(CamelContext context) { + if (getAsyncDelayedRedelivery() == null) { + return false; + } - public Integer getMaximumRedeliveries() { - return maximumRedeliveries; + try { + return CamelContextHelper.parseBoolean(context, getAsyncDelayedRedelivery()); + } catch (Exception e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } } - public void setMaximumRedeliveries(Integer maximumRedeliveries) { - this.maximumRedeliveries = maximumRedeliveries; + public void setAsyncDelayedRedelivery(String asyncDelayedRedelivery) { + this.asyncDelayedRedelivery = asyncDelayedRedelivery; } - public Boolean getUseCollisionAvoidance() { - return useCollisionAvoidance; + public String getBackOffMultiplier() { + return backOffMultiplier; } - public void setUseCollisionAvoidance(Boolean useCollisionAvoidance) { - this.useCollisionAvoidance = useCollisionAvoidance; + public void setBackOffMultiplier(String backOffMultiplier) { + this.backOffMultiplier = backOffMultiplier; } - public Boolean getUseExponentialBackOff() { + public String getUseExponentialBackOff() { return useExponentialBackOff; } - public void setUseExponentialBackOff(Boolean useExponentialBackOff) { + public void setUseExponentialBackOff(String useExponentialBackOff) { this.useExponentialBackOff = useExponentialBackOff; } - public Long getMaximumRedeliveryDelay() { - return maximumRedeliveryDelay; + public String getCollisionAvoidanceFactor() { + return collisionAvoidanceFactor; } - public void setMaximumRedeliveryDelay(Long maximumRedeliveryDelay) { - this.maximumRedeliveryDelay = maximumRedeliveryDelay; + public void setCollisionAvoidanceFactor(String collisionAvoidanceFactor) { + this.collisionAvoidanceFactor = collisionAvoidanceFactor; } - public void setRetriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) { - this.retriesExhaustedLogLevel = retriesExhaustedLogLevel; + public String getUseCollisionAvoidance() { + return useCollisionAvoidance; + } + + public void setUseCollisionAvoidance(String useCollisionAvoidance) { + this.useCollisionAvoidance = useCollisionAvoidance; + } + + public String getMaximumRedeliveryDelay() { + return maximumRedeliveryDelay; + } + + public void setMaximumRedeliveryDelay(String maximumRedeliveryDelay) { + this.maximumRedeliveryDelay = maximumRedeliveryDelay; } public LoggingLevel getRetriesExhaustedLogLevel() { return retriesExhaustedLogLevel; - } + } - public void setRetryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) { - this.retryAttemptedLogLevel = retryAttemptedLogLevel; + public void setRetriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) { + this.retriesExhaustedLogLevel = retriesExhaustedLogLevel; } public LoggingLevel getRetryAttemptedLogLevel() { return retryAttemptedLogLevel; } - public String getRef() { - return ref; - } - - public void setRef(String ref) { - this.ref = ref; + public void setRetryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) { + this.retryAttemptedLogLevel = retryAttemptedLogLevel; } - public Boolean getLogStackTrace() { - return logStackTrace; + public String getLogRetryAttempted() { + return logRetryAttempted; } - public void setLogStackTrace(Boolean logStackTrace) { - this.logStackTrace = logStackTrace; + public void setLogRetryAttempted(String logRetryAttempted) { + this.logRetryAttempted = logRetryAttempted; } - public Boolean getDisableRedelivery() { - return disableRedelivery; + public String getLogStackTrace() { + return logStackTrace; } - public void setDisableRedelivery(Boolean disableRedelivery) { - this.disableRedelivery = disableRedelivery; + public void setLogStackTrace(String logStackTrace) { + this.logStackTrace = logStackTrace; } - public Boolean isLogRetryStackTrace() { + public String getLogRetryStackTrace() { return logRetryStackTrace; } - public void setLogRetryStackTrace(Boolean logRetryStackTrace) { + public void setLogRetryStackTrace(String logRetryStackTrace) { this.logRetryStackTrace = logRetryStackTrace; } - public Boolean isLogHandled() { + public String getLogHandled() { return logHandled; } - public void setLogHandled(Boolean logHandled) { + public void setLogHandled(String logHandled) { this.logHandled = logHandled; } - public Boolean getLogContinued() { + public String getLogContinued() { return logContinued; } - public void setLogContinued(Boolean logContinued) { + public void setLogContinued(String logContinued) { this.logContinued = logContinued; } - public Boolean isLogRetryAttempted() { - return logRetryAttempted; + public String getLogExhausted() { + return logExhausted; } - public void setLogRetryAttempted(Boolean logRetryAttempted) { - this.logRetryAttempted = logRetryAttempted; + public void setLogExhausted(String logExhausted) { + this.logExhausted = logExhausted; } - public Boolean isLogExhausted() { - return logExhausted; + public String getDisableRedelivery() { + return disableRedelivery; } - public void setLogExhausted(Boolean logExhausted) { - this.logExhausted = logExhausted; + public void setDisableRedelivery(String disableRedelivery) { + this.disableRedelivery = disableRedelivery; } public String getDelayPattern() { 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=1070059&r1=1070058&r2=1070059&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 Sat Feb 12 12:04:33 2011 @@ -517,7 +517,7 @@ public abstract class RedeliveryErrorHan data.continuedPredicate = exceptionPolicy.getContinuedPolicy(); data.retryWhilePredicate = exceptionPolicy.getRetryWhilePolicy(); data.useOriginalInMessage = exceptionPolicy.isUseOriginalMessage(); - data.asyncDelayedRedelivery = exceptionPolicy.isAsyncDelayedRedelivery(); + data.asyncDelayedRedelivery = exceptionPolicy.isAsyncDelayedRedelivery(exchange.getContext()); // route specific failure handler? Processor processor = exceptionPolicy.getErrorHandler(); Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java?rev=1070059&r1=1070058&r2=1070059&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java Sat Feb 12 12:04:33 2011 @@ -243,6 +243,31 @@ public final class CamelContextHelper { } /** + * Parses the given text and converts it to a Double and handling property placeholders as well + * + * @param camelContext the camel context + * @param text the text + * @return the double vale, or <tt>null</tt> if the text was <tt>null</tt> + * @throws Exception is thrown if illegal argument or type conversion not possible + */ + public static Double parseDouble(CamelContext camelContext, String text) throws Exception { + // ensure we support property placeholders + String s = camelContext.resolvePropertyPlaceholders(text); + if (s != null) { + try { + return camelContext.getTypeConverter().mandatoryConvertTo(Double.class, s); + } catch (NumberFormatException e) { + if (s.equals(text)) { + throw new IllegalArgumentException("Error parsing [" + s + "] as an Integer.", e); + } else { + throw new IllegalArgumentException("Error parsing [" + s + "] from property " + text + " as an Integer.", e); + } + } + } + return null; + } + + /** * Parses the given text and converts it to an Boolean and handling property placeholders as well * * @param camelContext the camel context Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java (from r1070041, camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java&r1=1070041&r2=1070059&rev=1070059&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java Sat Feb 12 12:04:33 2011 @@ -20,49 +20,46 @@ import java.util.Properties; import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.impl.JndiRegistry; /** * @version $Revision$ */ -public class PropertiesComponentRefTest extends ContextTestSupport { +public class PropertiesComponentOnExceptionTest extends ContextTestSupport { - @Override - public boolean isUseRouteBuilder() { - return false; - } - - public void testPropertiesComponent() throws Exception { - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("{{start}}").to("properties:{{cool.result}}"); - } - }); - context.start(); - - getMockEndpoint("mock:result").expectedMessageCount(1); - - template.sendBody("direct:start", "Hello World"); + public void testPropertiesComponentOnException() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:dead"); + mock.expectedMessageCount(1); + mock.message(0).header(Exchange.REDELIVERED).isEqualTo(true); + mock.message(0).header(Exchange.REDELIVERY_COUNTER).isEqualTo(3); + + try { + template.sendBody("direct:start", "Hello World"); + fail("Should throw exception"); + } catch (Exception e) { + // expected + } assertMockEndpointsSatisfied(); } - public void testPropertiesComponentLocationsOverride() throws Exception { - context.addRoutes(new RouteBuilder() { + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { @Override public void configure() throws Exception { - from("direct:start").to("properties:{{bar.end}}?locations=ref:coolBar"); - } - }); - context.start(); - - getMockEndpoint("mock:bar").expectedMessageCount(1); + onException(Exception.class) + .redeliveryDelay("{{delay}}") + .maximumRedeliveries("{{max}}") + .to("mock:dead"); - template.sendBody("direct:start", "Hello World"); - - assertMockEndpointsSatisfied(); + from("direct:start") + .throwException(new IllegalAccessException("Damn")); + } + }; } @Override @@ -70,15 +67,9 @@ public class PropertiesComponentRefTest JndiRegistry jndi = super.createRegistry(); Properties cool = new Properties(); - cool.put("cool.end", "mock:end"); - cool.put("cool.result", "mock:result"); - cool.put("start", "direct:start"); - jndi.bind("myCoolProperties", cool); - - Properties bar = new Properties(); - bar.put("bar.end", "mock:bar"); - bar.put("dude", "direct:bar"); - jndi.bind("coolBar", bar); + cool.put("delay", "25"); + cool.put("max", "3"); + jndi.bind("myprop", cool); return jndi; } @@ -89,7 +80,7 @@ public class PropertiesComponentRefTest PropertiesComponent pc = new PropertiesComponent(); pc.setCamelContext(context); - pc.setLocations(new String[]{"ref:myCoolProperties"}); + pc.setLocations(new String[]{"ref:myprop"}); context.addComponent("properties", pc); return context; Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java?rev=1070059&view=auto ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java (added) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java Sat Feb 12 12:04:33 2011 @@ -0,0 +1,32 @@ +/** + * 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.component.properties; + +import org.apache.camel.CamelContext; + +import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext; + +/** + * @version $Revision$ + */ +public class SpringPropertiesComponentOnExceptionTest extends PropertiesComponentOnExceptionTest { + + protected CamelContext createCamelContext() throws Exception { + return createSpringCamelContext(this, "org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml"); + } + +} Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml (from r1070041, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml&r1=1070041&r2=1070059&rev=1070059&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml Sat Feb 12 12:04:33 2011 @@ -22,15 +22,22 @@ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd "> - <bean id="coolProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> - <property name="location" value="classpath:org/apache/camel/component/properties/cheese.properties"/> + <bean id="damn" class="java.lang.IllegalArgumentException"> + <constructor-arg index="0" value="Damn"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> - <propertyPlaceholder id="properties" location="ref:coolProperties"/> + <propertyPlaceholder id="properties" location="org/apache/camel/component/properties/cheese.properties"/> + + <onException> + <exception>java.lang.Exception</exception> + <redeliveryPolicy redeliveryDelay="{{delay}}" maximumRedeliveries="{{max}}"/> + <to uri="mock:dead"/> + </onException> + <route> <from uri="direct:start"/> - <to uri="{{cool.end}}"/> + <throwException ref="damn"/> </route> </camelContext> Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties?rev=1070059&r1=1070058&r2=1070059&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties Sat Feb 12 12:04:33 2011 @@ -20,3 +20,6 @@ cool.bar=bar myCoolCharset=iso-8859-1 slipDelimiter=## + +delay=25 +max=3 \ No newline at end of file