001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.camel.builder; 019 020 import org.apache.camel.Exchange; 021 import org.apache.camel.Expression; 022 import org.apache.camel.Processor; 023 import org.apache.camel.processor.DeadLetterChannel; 024 import org.apache.camel.processor.RecipientList; 025 import org.apache.camel.processor.RedeliveryPolicy; 026 import org.apache.camel.processor.Logger; 027 import org.apache.camel.processor.LoggingLevel; 028 import org.apache.commons.logging.Log; 029 import org.apache.commons.logging.LogFactory; 030 031 /** 032 * A builder of a <a href="http://activemq.apache.org/camel/dead-letter-channel.html">Dead Letter Channel</a> 033 * 034 * @version $Revision: 534145 $ 035 */ 036 public class DeadLetterChannelBuilder implements ErrorHandlerBuilder { 037 private RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy(); 038 private ProcessorFactory deadLetterFactory; 039 private Processor defaultDeadLetterEndpoint; 040 private Expression defaultDeadLetterEndpointExpression; 041 private String defaultDeadLetterEndpointUri = "log:org.apache.camel.DeadLetterChannel:error"; 042 private Logger logger = DeadLetterChannel.createDefaultLogger(); 043 044 public DeadLetterChannelBuilder() { 045 } 046 047 public DeadLetterChannelBuilder(Processor processor) { 048 this(new ConstantProcessorBuilder(processor)); 049 } 050 051 public DeadLetterChannelBuilder(ProcessorFactory deadLetterFactory) { 052 this.deadLetterFactory = deadLetterFactory; 053 } 054 055 public ErrorHandlerBuilder copy() { 056 DeadLetterChannelBuilder answer = new DeadLetterChannelBuilder(deadLetterFactory); 057 answer.setRedeliveryPolicy(getRedeliveryPolicy().copy()); 058 return answer; 059 } 060 061 public Processor createErrorHandler(Processor processor) throws Exception { 062 Processor deadLetter = getDeadLetterFactory().createProcessor(); 063 return new DeadLetterChannel(processor, deadLetter, getRedeliveryPolicy(), getLogger()); 064 } 065 066 // Builder methods 067 //------------------------------------------------------------------------- 068 public DeadLetterChannelBuilder backOffMultiplier(double backOffMultiplier) { 069 getRedeliveryPolicy().backOffMultiplier(backOffMultiplier); 070 return this; 071 } 072 073 public DeadLetterChannelBuilder collisionAvoidancePercent(short collisionAvoidancePercent) { 074 getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent); 075 return this; 076 } 077 078 public DeadLetterChannelBuilder initialRedeliveryDelay(long initialRedeliveryDelay) { 079 getRedeliveryPolicy().initialRedeliveryDelay(initialRedeliveryDelay); 080 return this; 081 } 082 083 public DeadLetterChannelBuilder maximumRedeliveries(int maximumRedeliveries) { 084 getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries); 085 return this; 086 } 087 088 public DeadLetterChannelBuilder useCollisionAvoidance() { 089 getRedeliveryPolicy().useCollisionAvoidance(); 090 return this; 091 } 092 093 public DeadLetterChannelBuilder useExponentialBackOff() { 094 getRedeliveryPolicy().useExponentialBackOff(); 095 return this; 096 } 097 098 /** 099 * Sets the logger used for caught exceptions 100 */ 101 public DeadLetterChannelBuilder logger(Logger logger) { 102 setLogger(logger); 103 return this; 104 } 105 106 /** 107 * Sets the logging level of exceptions caught 108 */ 109 public DeadLetterChannelBuilder loggingLevel(LoggingLevel level) { 110 getLogger().setLevel(level); 111 return this; 112 } 113 114 /** 115 * Sets the log used for caught exceptions 116 */ 117 public DeadLetterChannelBuilder log(Log log) { 118 getLogger().setLog(log); 119 return this; 120 } 121 122 /** 123 * Sets the log used for caught exceptions 124 */ 125 public DeadLetterChannelBuilder log(String log) { 126 return log(LogFactory.getLog(log)); 127 } 128 129 /** 130 * Sets the log used for caught exceptions 131 */ 132 public DeadLetterChannelBuilder log(Class log) { 133 return log(LogFactory.getLog(log)); 134 } 135 136 // Properties 137 //------------------------------------------------------------------------- 138 public RedeliveryPolicy getRedeliveryPolicy() { 139 return redeliveryPolicy; 140 } 141 142 /** 143 * Sets the redelivery policy 144 */ 145 public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) { 146 this.redeliveryPolicy = redeliveryPolicy; 147 } 148 149 public ProcessorFactory getDeadLetterFactory() { 150 if (deadLetterFactory == null) { 151 deadLetterFactory = new ProcessorFactory() { 152 public Processor createProcessor() { 153 return getDefaultDeadLetterEndpoint(); 154 } 155 }; 156 } 157 return deadLetterFactory; 158 } 159 160 /** 161 * Sets the default dead letter queue factory 162 */ 163 public void setDeadLetterFactory(ProcessorFactory deadLetterFactory) { 164 this.deadLetterFactory = deadLetterFactory; 165 } 166 167 public Processor getDefaultDeadLetterEndpoint() { 168 if (defaultDeadLetterEndpoint == null) { 169 defaultDeadLetterEndpoint = new RecipientList(getDefaultDeadLetterEndpointExpression()); 170 } 171 return defaultDeadLetterEndpoint; 172 } 173 174 /** 175 * Sets the default dead letter endpoint used 176 */ 177 public void setDefaultDeadLetterEndpoint(Processor defaultDeadLetterEndpoint) { 178 this.defaultDeadLetterEndpoint = defaultDeadLetterEndpoint; 179 } 180 181 public Expression getDefaultDeadLetterEndpointExpression() { 182 if (defaultDeadLetterEndpointExpression == null) { 183 defaultDeadLetterEndpointExpression = ExpressionBuilder.constantExpression(getDefaultDeadLetterEndpointUri()); 184 } 185 return defaultDeadLetterEndpointExpression; 186 } 187 188 /** 189 * Sets the expression used to decide the dead letter channel endpoint for an exchange 190 * if no factory is provided via {@link #setDeadLetterFactory(ProcessorFactory)} 191 */ 192 public void setDefaultDeadLetterEndpointExpression(Expression defaultDeadLetterEndpointExpression) { 193 this.defaultDeadLetterEndpointExpression = defaultDeadLetterEndpointExpression; 194 } 195 196 public String getDefaultDeadLetterEndpointUri() { 197 return defaultDeadLetterEndpointUri; 198 } 199 200 /** 201 * Sets the default dead letter endpoint URI used if no factory is provided via {@link #setDeadLetterFactory(ProcessorFactory)} 202 * and no expression is provided via {@link #setDefaultDeadLetterEndpointExpression(Expression)} 203 * 204 * @param defaultDeadLetterEndpointUri the default URI if no deadletter factory or expression is provided 205 */ 206 public void setDefaultDeadLetterEndpointUri(String defaultDeadLetterEndpointUri) { 207 this.defaultDeadLetterEndpointUri = defaultDeadLetterEndpointUri; 208 } 209 210 public Logger getLogger() { 211 return logger; 212 } 213 214 public void setLogger(Logger logger) { 215 this.logger = logger; 216 } 217 }