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: 753284 $ 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 @XmlAttribute 060 private Boolean disableRedelivery; 061 062 public RedeliveryPolicy createRedeliveryPolicy(CamelContext context, RedeliveryPolicy parentPolicy) { 063 if (ref != null) { 064 // lookup in registry if ref provided 065 return CamelContextHelper.mandatoryLookup(context, ref, RedeliveryPolicy.class); 066 } 067 068 RedeliveryPolicy answer = parentPolicy.copy(); 069 070 // copy across the properties - if they are set 071 if (maximumRedeliveries != null) { 072 answer.setMaximumRedeliveries(maximumRedeliveries); 073 } 074 if (redeliveryDelay != null) { 075 answer.setDelay(redeliveryDelay); 076 } 077 if (retriesExhaustedLogLevel != null) { 078 answer.setRetriesExhaustedLogLevel(retriesExhaustedLogLevel); 079 } 080 if (retryAttemptedLogLevel != null) { 081 answer.setRetryAttemptedLogLevel(retryAttemptedLogLevel); 082 } 083 if (backOffMultiplier != null) { 084 answer.setBackOffMultiplier(backOffMultiplier); 085 } 086 if (useExponentialBackOff != null) { 087 answer.setUseExponentialBackOff(useExponentialBackOff); 088 } 089 if (collisionAvoidanceFactor != null) { 090 answer.setCollisionAvoidanceFactor(collisionAvoidanceFactor); 091 } 092 if (useCollisionAvoidance != null) { 093 answer.setUseCollisionAvoidance(useCollisionAvoidance); 094 } 095 if (maximumRedeliveryDelay != null) { 096 answer.setMaximumRedeliveryDelay(maximumRedeliveryDelay); 097 } 098 if (logStackTrace != null) { 099 answer.setLogStackTrace(logStackTrace); 100 } 101 if (disableRedelivery != null && disableRedelivery) { 102 answer.setMaximumRedeliveries(0); 103 } 104 105 return answer; 106 } 107 108 public String toString() { 109 return "RedeliveryPolicy[maximumRedeliveries: " + maximumRedeliveries + "]"; 110 } 111 112 // Fluent API 113 //------------------------------------------------------------------------- 114 /** 115 * Sets the back off multiplier 116 * 117 * @param backOffMultiplier the back off multiplier 118 * @return the builder 119 */ 120 public RedeliveryPolicyDefinition backOffMultiplier(double backOffMultiplier) { 121 setBackOffMultiplier(backOffMultiplier); 122 return this; 123 } 124 125 /** 126 * Sets the collision avoidance percentage 127 * 128 * @param collisionAvoidancePercent the percentage 129 * @return the builder 130 */ 131 public RedeliveryPolicyDefinition collisionAvoidancePercent(double collisionAvoidancePercent) { 132 setCollisionAvoidanceFactor(collisionAvoidancePercent * 0.01d); 133 return this; 134 } 135 136 /** 137 * Sets the collision avoidance factor 138 * 139 * @param collisionAvoidanceFactor the factor 140 * @return the builder 141 */ 142 public RedeliveryPolicyDefinition collisionAvoidanceFactor(double collisionAvoidanceFactor) { 143 setCollisionAvoidanceFactor(collisionAvoidanceFactor); 144 return this; 145 } 146 147 /** 148 * Sets the fixed delay between redeliveries 149 * 150 * @param delay delay in millis 151 * @return the builder 152 */ 153 public RedeliveryPolicyDefinition redeliveryDelay(long delay) { 154 setRedeliveryDelay(delay); 155 return this; 156 } 157 158 /** 159 * Sets the logging level to use when retries has exhausted 160 * 161 * @param retriesExhaustedLogLevel the logging level 162 * @return the builder 163 */ 164 public RedeliveryPolicyDefinition retriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) { 165 setRetriesExhaustedLogLevel(retriesExhaustedLogLevel); 166 return this; 167 } 168 169 /** 170 * Sets the logging level to use for logging retry attempts 171 * 172 * @param retryAttemptedLogLevel the logging level 173 * @return the builder 174 */ 175 public RedeliveryPolicyDefinition retryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) { 176 setRetryAttemptedLogLevel(retryAttemptedLogLevel); 177 return this; 178 } 179 180 /** 181 * Sets wheter stack traces should be logged, can be used to reduce verbose. 182 * 183 * @param logStackTrace wheter stack traces should be logged or not 184 * @return the builder 185 */ 186 public RedeliveryPolicyDefinition logStackTrace(boolean logStackTrace) { 187 setLogStackTrace(logStackTrace); 188 return this; 189 } 190 191 192 193 /** 194 * Sets the maximum redeliveries 195 * <ul> 196 * <li>5 = default value</li> 197 * <li>0 = no redeliveries</li> 198 * <li>-1 = redeliver forever</li> 199 * </ul> 200 * 201 * @param maximumRedeliveries the value 202 * @return the builder 203 */ 204 public RedeliveryPolicyDefinition maximumRedeliveries(int maximumRedeliveries) { 205 setMaximumRedeliveries(maximumRedeliveries); 206 return this; 207 } 208 209 /** 210 * Turn on collision avoidance. 211 * 212 * @return the builder 213 */ 214 public RedeliveryPolicyDefinition useCollisionAvoidance() { 215 setUseCollisionAvoidance(Boolean.TRUE); 216 return this; 217 } 218 219 /** 220 * Turn on exponential backk off 221 * 222 * @return the builder 223 */ 224 public RedeliveryPolicyDefinition useExponentialBackOff() { 225 setUseExponentialBackOff(Boolean.TRUE); 226 return this; 227 } 228 229 /** 230 * Sets the maximum delay between redelivery 231 * 232 * @param maximumRedeliveryDelay the delay in millis 233 * @return the builder 234 */ 235 public RedeliveryPolicyDefinition maximumRedeliveryDelay(long maximumRedeliveryDelay) { 236 setMaximumRedeliveryDelay(maximumRedeliveryDelay); 237 return this; 238 } 239 240 /** 241 * Use redelivery policy looked up in the registry 242 * 243 * @param ref reference to the redelivery policy to lookup and use 244 * @return the builder 245 */ 246 public RedeliveryPolicyDefinition ref(String ref) { 247 setRef(ref); 248 return this; 249 } 250 251 // Properties 252 //------------------------------------------------------------------------- 253 254 public Double getBackOffMultiplier() { 255 return backOffMultiplier; 256 } 257 258 public void setBackOffMultiplier(Double backOffMultiplier) { 259 this.backOffMultiplier = backOffMultiplier; 260 } 261 262 public Double getCollisionAvoidanceFactor() { 263 return collisionAvoidanceFactor; 264 } 265 266 public void setCollisionAvoidanceFactor(Double collisionAvoidanceFactor) { 267 this.collisionAvoidanceFactor = collisionAvoidanceFactor; 268 } 269 270 public Long getRedeliveryDelay() { 271 return redeliveryDelay; 272 } 273 274 public void setRedeliveryDelay(Long delay) { 275 this.redeliveryDelay = delay; 276 } 277 278 public Integer getMaximumRedeliveries() { 279 return maximumRedeliveries; 280 } 281 282 public void setMaximumRedeliveries(Integer maximumRedeliveries) { 283 this.maximumRedeliveries = maximumRedeliveries; 284 } 285 286 public Boolean getUseCollisionAvoidance() { 287 return useCollisionAvoidance; 288 } 289 290 public void setUseCollisionAvoidance(Boolean useCollisionAvoidance) { 291 this.useCollisionAvoidance = useCollisionAvoidance; 292 } 293 294 public Boolean getUseExponentialBackOff() { 295 return useExponentialBackOff; 296 } 297 298 public void setUseExponentialBackOff(Boolean useExponentialBackOff) { 299 this.useExponentialBackOff = useExponentialBackOff; 300 } 301 302 public Long getMaximumRedeliveryDelay() { 303 return maximumRedeliveryDelay; 304 } 305 306 public void setMaximumRedeliveryDelay(Long maximumRedeliveryDelay) { 307 this.maximumRedeliveryDelay = maximumRedeliveryDelay; 308 } 309 310 public void setRetriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) { 311 this.retriesExhaustedLogLevel = retriesExhaustedLogLevel; 312 } 313 314 public LoggingLevel getRetriesExhaustedLogLevel() { 315 return retriesExhaustedLogLevel; 316 } 317 318 public void setRetryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) { 319 this.retryAttemptedLogLevel = retryAttemptedLogLevel; 320 } 321 322 public LoggingLevel getRetryAttemptedLogLevel() { 323 return retryAttemptedLogLevel; 324 } 325 326 public String getRef() { 327 return ref; 328 } 329 330 public void setRef(String ref) { 331 this.ref = ref; 332 } 333 334 public Boolean getLogStackTrace() { 335 return logStackTrace; 336 } 337 338 public void setLogStackTrace(Boolean logStackTrace) { 339 this.logStackTrace = logStackTrace; 340 } 341 342 public Boolean getDisableRedelivery() { 343 return disableRedelivery; 344 } 345 346 public void setDisableRedelivery(Boolean disableRedelivery) { 347 this.disableRedelivery = disableRedelivery; 348 } 349 }