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 }