001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.model; 018 019 import javax.xml.bind.annotation.XmlAccessType; 020 import javax.xml.bind.annotation.XmlAccessorType; 021 import javax.xml.bind.annotation.XmlAttribute; 022 import javax.xml.bind.annotation.XmlRootElement; 023 024 import org.apache.camel.CamelContext; 025 import org.apache.camel.LoggingLevel; 026 import org.apache.camel.processor.RedeliveryPolicy; 027 import org.apache.camel.util.CamelContextHelper; 028 029 /** 030 * Represents an XML <redeliveryPolicy/> element 031 * 032 * @version $Revision: 751447 $ 033 */ 034 @XmlRootElement(name = "redeliveryPolicy") 035 @XmlAccessorType(XmlAccessType.FIELD) 036 public class RedeliveryPolicyDefinition { 037 @XmlAttribute() 038 private String ref; 039 @XmlAttribute 040 private Integer maximumRedeliveries; 041 @XmlAttribute 042 private Long redeliveryDelay; 043 @XmlAttribute 044 private Double backOffMultiplier; 045 @XmlAttribute 046 private Boolean useExponentialBackOff; 047 @XmlAttribute 048 private Double collisionAvoidanceFactor; 049 @XmlAttribute 050 private Boolean useCollisionAvoidance; 051 @XmlAttribute 052 private Long maximumRedeliveryDelay; 053 @XmlAttribute 054 private LoggingLevel retriesExhaustedLogLevel; 055 @XmlAttribute 056 private LoggingLevel retryAttemptedLogLevel; 057 @XmlAttribute 058 private Boolean logStackTrace; 059 060 public RedeliveryPolicy createRedeliveryPolicy(CamelContext context, RedeliveryPolicy parentPolicy) { 061 if (ref != null) { 062 // lookup in registry if ref provided 063 return CamelContextHelper.mandatoryLookup(context, ref, RedeliveryPolicy.class); 064 } 065 066 RedeliveryPolicy answer = parentPolicy.copy(); 067 068 // copy across the properties - if they are set 069 if (maximumRedeliveries != null) { 070 answer.setMaximumRedeliveries(maximumRedeliveries); 071 } 072 if (redeliveryDelay != null) { 073 answer.setDelay(redeliveryDelay); 074 } 075 if (retriesExhaustedLogLevel != null) { 076 answer.setRetriesExhaustedLogLevel(retriesExhaustedLogLevel); 077 } 078 if (retryAttemptedLogLevel != null) { 079 answer.setRetryAttemptedLogLevel(retryAttemptedLogLevel); 080 } 081 if (backOffMultiplier != null) { 082 answer.setBackOffMultiplier(backOffMultiplier); 083 } 084 if (useExponentialBackOff != null) { 085 answer.setUseExponentialBackOff(useExponentialBackOff); 086 } 087 if (collisionAvoidanceFactor != null) { 088 answer.setCollisionAvoidanceFactor(collisionAvoidanceFactor); 089 } 090 if (useCollisionAvoidance != null) { 091 answer.setUseCollisionAvoidance(useCollisionAvoidance); 092 } 093 if (maximumRedeliveryDelay != null) { 094 answer.setMaximumRedeliveryDelay(maximumRedeliveryDelay); 095 } 096 if (logStackTrace != null) { 097 answer.setLogStackTrace(logStackTrace); 098 } 099 return answer; 100 } 101 102 public String toString() { 103 return "RedeliveryPolicy[maximumRedeliveries: " + maximumRedeliveries + "]"; 104 } 105 106 // Fluent API 107 //------------------------------------------------------------------------- 108 /** 109 * Sets the back off multiplier 110 * 111 * @param backOffMultiplier the back off multiplier 112 * @return the builder 113 */ 114 public RedeliveryPolicyDefinition backOffMultiplier(double backOffMultiplier) { 115 setBackOffMultiplier(backOffMultiplier); 116 return this; 117 } 118 119 /** 120 * Sets the collision avoidance percentage 121 * 122 * @param collisionAvoidancePercent the percentage 123 * @return the builder 124 */ 125 public RedeliveryPolicyDefinition collisionAvoidancePercent(double collisionAvoidancePercent) { 126 setCollisionAvoidanceFactor(collisionAvoidancePercent * 0.01d); 127 return this; 128 } 129 130 /** 131 * Sets the collision avoidance factor 132 * 133 * @param collisionAvoidanceFactor the factor 134 * @return the builder 135 */ 136 public RedeliveryPolicyDefinition collisionAvoidanceFactor(double collisionAvoidanceFactor) { 137 setCollisionAvoidanceFactor(collisionAvoidanceFactor); 138 return this; 139 } 140 141 /** 142 * Sets the fixed delay between redeliveries 143 * 144 * @param delay delay in millis 145 * @return the builder 146 */ 147 public RedeliveryPolicyDefinition redeliveryDelay(long delay) { 148 setRedeliveryDelay(delay); 149 return this; 150 } 151 152 /** 153 * Sets the logging level to use when retries has exhausted 154 * 155 * @param retriesExhaustedLogLevel the logging level 156 * @return the builder 157 */ 158 public RedeliveryPolicyDefinition retriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) { 159 setRetriesExhaustedLogLevel(retriesExhaustedLogLevel); 160 return this; 161 } 162 163 /** 164 * Sets the logging level to use for logging retry attempts 165 * 166 * @param retryAttemptedLogLevel the logging level 167 * @return the builder 168 */ 169 public RedeliveryPolicyDefinition retryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) { 170 setRetryAttemptedLogLevel(retryAttemptedLogLevel); 171 return this; 172 } 173 174 /** 175 * Sets wheter stack traces should be logged, can be used to reduce verbose. 176 * 177 * @param logStackTrace wheter stack traces should be logged or not 178 * @return the builder 179 */ 180 public RedeliveryPolicyDefinition logStackTrace(boolean logStackTrace) { 181 setLogStackTrace(logStackTrace); 182 return this; 183 } 184 185 186 187 /** 188 * Sets the maximum redeliveries 189 * <ul> 190 * <li>5 = default value</li> 191 * <li>0 = no redeliveries</li> 192 * <li>-1 = redeliver forever</li> 193 * </ul> 194 * 195 * @param maximumRedeliveries the value 196 * @return the builder 197 */ 198 public RedeliveryPolicyDefinition maximumRedeliveries(int maximumRedeliveries) { 199 setMaximumRedeliveries(maximumRedeliveries); 200 return this; 201 } 202 203 /** 204 * Turn on collision avoidance. 205 * 206 * @return the builder 207 */ 208 public RedeliveryPolicyDefinition useCollisionAvoidance() { 209 setUseCollisionAvoidance(Boolean.TRUE); 210 return this; 211 } 212 213 /** 214 * Turn on exponential backk off 215 * 216 * @return the builder 217 */ 218 public RedeliveryPolicyDefinition useExponentialBackOff() { 219 setUseExponentialBackOff(Boolean.TRUE); 220 return this; 221 } 222 223 /** 224 * Sets the maximum delay between redelivery 225 * 226 * @param maximumRedeliveryDelay the delay in millis 227 * @return the builder 228 */ 229 public RedeliveryPolicyDefinition maximumRedeliveryDelay(long maximumRedeliveryDelay) { 230 setMaximumRedeliveryDelay(maximumRedeliveryDelay); 231 return this; 232 } 233 234 /** 235 * Use redelivery policy looked up in the registry 236 * 237 * @param ref reference to the redelivery policy to lookup and use 238 * @return the builder 239 */ 240 public RedeliveryPolicyDefinition ref(String ref) { 241 setRef(ref); 242 return this; 243 } 244 245 // Properties 246 //------------------------------------------------------------------------- 247 248 public Double getBackOffMultiplier() { 249 return backOffMultiplier; 250 } 251 252 public void setBackOffMultiplier(Double backOffMultiplier) { 253 this.backOffMultiplier = backOffMultiplier; 254 } 255 256 public Double getCollisionAvoidanceFactor() { 257 return collisionAvoidanceFactor; 258 } 259 260 public void setCollisionAvoidanceFactor(Double collisionAvoidanceFactor) { 261 this.collisionAvoidanceFactor = collisionAvoidanceFactor; 262 } 263 264 public Long getRedeliveryDelay() { 265 return redeliveryDelay; 266 } 267 268 public void setRedeliveryDelay(Long delay) { 269 this.redeliveryDelay = delay; 270 } 271 272 public Integer getMaximumRedeliveries() { 273 return maximumRedeliveries; 274 } 275 276 public void setMaximumRedeliveries(Integer maximumRedeliveries) { 277 this.maximumRedeliveries = maximumRedeliveries; 278 } 279 280 public Boolean getUseCollisionAvoidance() { 281 return useCollisionAvoidance; 282 } 283 284 public void setUseCollisionAvoidance(Boolean useCollisionAvoidance) { 285 this.useCollisionAvoidance = useCollisionAvoidance; 286 } 287 288 public Boolean getUseExponentialBackOff() { 289 return useExponentialBackOff; 290 } 291 292 public void setUseExponentialBackOff(Boolean useExponentialBackOff) { 293 this.useExponentialBackOff = useExponentialBackOff; 294 } 295 296 public Long getMaximumRedeliveryDelay() { 297 return maximumRedeliveryDelay; 298 } 299 300 public void setMaximumRedeliveryDelay(Long maximumRedeliveryDelay) { 301 this.maximumRedeliveryDelay = maximumRedeliveryDelay; 302 } 303 304 public void setRetriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) { 305 this.retriesExhaustedLogLevel = retriesExhaustedLogLevel; 306 } 307 308 public LoggingLevel getRetriesExhaustedLogLevel() { 309 return retriesExhaustedLogLevel; 310 } 311 312 public void setRetryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) { 313 this.retryAttemptedLogLevel = retryAttemptedLogLevel; 314 } 315 316 public LoggingLevel getRetryAttemptedLogLevel() { 317 return retryAttemptedLogLevel; 318 } 319 320 public String getRef() { 321 return ref; 322 } 323 324 public void setRef(String ref) { 325 this.ref = ref; 326 } 327 328 public Boolean getLogStackTrace() { 329 return logStackTrace; 330 } 331 332 public void setLogStackTrace(Boolean logStackTrace) { 333 this.logStackTrace = logStackTrace; 334 } 335 }