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.management.mbean;
018    
019    import org.apache.camel.LoggingLevel;
020    import org.apache.camel.Processor;
021    import org.apache.camel.builder.ErrorHandlerBuilder;
022    import org.apache.camel.processor.ErrorHandlerSupport;
023    import org.apache.camel.processor.RedeliveryErrorHandler;
024    import org.apache.camel.spi.ManagementStrategy;
025    import org.apache.camel.spi.RouteContext;
026    import org.springframework.jmx.export.annotation.ManagedAttribute;
027    import org.springframework.jmx.export.annotation.ManagedResource;
028    
029    /**
030     * @version $Revision: 905292 $
031     */
032    @ManagedResource(description = "Managed ErrorHandler")
033    public class ManagedErrorHandler {
034    
035        private RouteContext routeContext;
036        private Processor errorHandler;
037        private ErrorHandlerBuilder errorHandlerBuilder;
038    
039        public ManagedErrorHandler(RouteContext routeContext, Processor errorHandler, ErrorHandlerBuilder builder) {
040            this.routeContext = routeContext;
041            this.errorHandler = errorHandler;
042            this.errorHandlerBuilder = builder;
043        }
044    
045        public void init(ManagementStrategy strategy) {
046            // do nothing
047        }
048    
049        public RouteContext getRouteContext() {
050            return routeContext;
051        }
052    
053        public Processor getErrorHandler() {
054            return errorHandler;
055        }
056    
057        public ErrorHandlerBuilder getErrorHandlerBuilder() {
058            return errorHandlerBuilder;
059        }
060    
061        @ManagedAttribute(description = "Camel id")
062        public String getCamelId() {
063            return routeContext.getCamelContext().getName();
064        }
065    
066        @ManagedAttribute(description = "Does the error handler support redelivery")
067        public boolean isSupportRedelivery() {
068            return errorHandler instanceof RedeliveryErrorHandler;
069        }
070    
071        @ManagedAttribute(description = "Is this error handler a dead letter channel")
072        public boolean isDeadLetterChannel() {
073            if (!isSupportRedelivery()) {
074                return false;
075            }
076    
077            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
078            return redelivery.getDeadLetter() != null;
079        }
080    
081        @ManagedAttribute(description = "When a message is moved to dead letter channel is it the original message or recent message")
082        public boolean isDeadLetterUseOriginalMessage() {
083            if (!isSupportRedelivery()) {
084                return false;
085            }
086    
087            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
088            return redelivery.isUseOriginalMessagePolicy();
089        }
090    
091        @ManagedAttribute(description = "Does this error handler support transactions")
092        public boolean isSupportTransactions() {
093            if (errorHandler instanceof ErrorHandlerSupport) {
094                ErrorHandlerSupport ehs = (ErrorHandlerSupport) errorHandler;
095                return ehs.supportTransacted();
096            } else {
097                return false;
098            }
099        }
100    
101        @ManagedAttribute(description = "Endpoint Uri for the dead letter channel where dead message is move to")
102        public String getDeadLetterChannelEndpointUri() {
103            if (!isSupportRedelivery()) {
104                return null;
105            }
106    
107            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
108            return redelivery.getDeadLetterUri();
109        }
110    
111        @ManagedAttribute(description = "RedeliveryPolicy for maximum redeliveries")
112        public Integer getMaximumRedeliveries() {
113            if (!isSupportRedelivery()) {
114                return null;
115            }
116    
117            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
118            return redelivery.getRedeliveryPolicy().getMaximumRedeliveries();
119        }
120    
121        @ManagedAttribute(description = "RedeliveryPolicy for maximum redeliveries")
122        public void setMaximumRedeliveries(Integer maximum) {
123            if (!isSupportRedelivery()) {
124                throw new IllegalArgumentException("This error handler does not support redelivery");
125            }
126    
127            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
128            redelivery.getRedeliveryPolicy().setMaximumRedeliveries(maximum);
129        }
130    
131        @ManagedAttribute(description = "RedeliveryPolicy for maximum redelivery delay")
132        public Long getMaximumRedeliveryDelay() {
133            if (!isSupportRedelivery()) {
134                return null;
135            }
136    
137            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
138            return redelivery.getRedeliveryPolicy().getMaximumRedeliveryDelay();
139        }
140    
141        @ManagedAttribute(description = "RedeliveryPolicy for maximum redelivery delay")
142        public void setMaximumRedeliveryDelay(Long delay) {
143            if (!isSupportRedelivery()) {
144                throw new IllegalArgumentException("This error handler does not support redelivery");
145            }
146    
147            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
148            redelivery.getRedeliveryPolicy().setMaximumRedeliveryDelay(delay);
149        }
150    
151        @ManagedAttribute(description = "RedeliveryPolicy for redelivery delay")
152        public Long getRedeliveryDelay() {
153            if (!isSupportRedelivery()) {
154                return null;
155            }
156    
157            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
158            return redelivery.getRedeliveryPolicy().getRedeliverDelay();
159        }
160    
161        @ManagedAttribute(description = "RedeliveryPolicy for redelivery delay")
162        public void setRedeliveryDelay(Long delay) {
163            if (!isSupportRedelivery()) {
164                throw new IllegalArgumentException("This error handler does not support redelivery");
165            }
166    
167            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
168            redelivery.getRedeliveryPolicy().setRedeliverDelay(delay);
169        }
170    
171        @ManagedAttribute(description = "RedeliveryPolicy for backoff multipler")
172        public Double getBackOffMultiplier() {
173            if (!isSupportRedelivery()) {
174                return null;
175            }
176    
177            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
178            return redelivery.getRedeliveryPolicy().getBackOffMultiplier();
179        }
180    
181        @ManagedAttribute(description = "RedeliveryPolicy for backoff multipler")
182        public void setBackOffMultiplier(Double multiplier) {
183            if (!isSupportRedelivery()) {
184                throw new IllegalArgumentException("This error handler does not support redelivery");
185            }
186    
187            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
188            redelivery.getRedeliveryPolicy().setBackOffMultiplier(multiplier);
189        }
190    
191        @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance factor")
192        public Double getCollisionAvoidanceFactor() {
193            if (!isSupportRedelivery()) {
194                return null;
195            }
196    
197            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
198            return redelivery.getRedeliveryPolicy().getCollisionAvoidanceFactor();
199        }
200    
201        @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance factor")
202        public void setCollisionAvoidanceFactor(Double factor) {
203            if (!isSupportRedelivery()) {
204                throw new IllegalArgumentException("This error handler does not support redelivery");
205            }
206    
207            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
208            redelivery.getRedeliveryPolicy().setCollisionAvoidanceFactor(factor);
209        }
210    
211        @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance percent")
212        public Double getCollisionAvoidancePercent() {
213            if (!isSupportRedelivery()) {
214                return null;
215            }
216    
217            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
218            return (double) redelivery.getRedeliveryPolicy().getCollisionAvoidancePercent();  
219        }
220    
221        @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance percent")
222        public void setCollisionAvoidancePercent(Double percent) {
223            if (!isSupportRedelivery()) {
224                throw new IllegalArgumentException("This error handler does not support redelivery");
225            }
226    
227            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
228            redelivery.getRedeliveryPolicy().setCollisionAvoidancePercent(percent);
229        }
230    
231        @ManagedAttribute(description = "RedeliveryPolicy for delay pattern")
232        public String getDelayPattern() {
233            if (!isSupportRedelivery()) {
234                return null;
235            }
236    
237            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
238            return redelivery.getRedeliveryPolicy().getDelayPattern();
239        }
240    
241        @ManagedAttribute(description = "RedeliveryPolicy for delay pattern")
242        public void setDelayPattern(String pattern) {
243            if (!isSupportRedelivery()) {
244                throw new IllegalArgumentException("This error handler does not support redelivery");
245            }
246    
247            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
248            redelivery.getRedeliveryPolicy().setDelayPattern(pattern);
249        }
250    
251        @ManagedAttribute(description = "RedeliveryPolicy for logging level when retries exhausted")
252        public String getRetriesExhaustedLogLevel() {
253            if (!isSupportRedelivery()) {
254                return null;
255            }
256    
257            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
258            return redelivery.getRedeliveryPolicy().getRetriesExhaustedLogLevel().name();
259        }
260    
261        @ManagedAttribute(description = "RedeliveryPolicy for logging level when retries exhausted")
262        public void setRetriesExhaustedLogLevel(String level) {
263            if (!isSupportRedelivery()) {
264                throw new IllegalArgumentException("This error handler does not support redelivery");
265            }
266    
267            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
268            redelivery.getRedeliveryPolicy().setRetriesExhaustedLogLevel(LoggingLevel.valueOf(level));
269        }
270    
271        @ManagedAttribute(description = "RedeliveryPolicy for logging level when attempting retry")
272        public String getRetryAttemptedLogLevel() {
273            if (!isSupportRedelivery()) {
274                return null;
275            }
276    
277            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
278            return redelivery.getRedeliveryPolicy().getRetryAttemptedLogLevel().name();
279        }
280    
281        @ManagedAttribute(description = "RedeliveryPolicy for logging level when attempting retry")
282        public void setRetryAttemptedLogLevel(String level) {
283            if (!isSupportRedelivery()) {
284                throw new IllegalArgumentException("This error handler does not support redelivery");
285            }
286    
287            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
288            redelivery.getRedeliveryPolicy().setRetryAttemptedLogLevel(LoggingLevel.valueOf(level));
289        }
290    
291        @ManagedAttribute(description = "RedeliveryPolicy for logging stack traces")
292        public Boolean getLogStackTrace() {
293            if (!isSupportRedelivery()) {
294                return null;
295            }
296    
297            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
298            return redelivery.getRedeliveryPolicy().isLogStackTrace();
299        }
300    
301        @ManagedAttribute(description = "RedeliveryPolicy for logging stack traces")
302        public void setLogStackTrace(Boolean log) {
303            if (!isSupportRedelivery()) {
304                throw new IllegalArgumentException("This error handler does not support redelivery");
305            }
306    
307            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
308            redelivery.getRedeliveryPolicy().setLogStackTrace(log);
309        }
310    
311        @ManagedAttribute(description = "RedeliveryPolicy for logging redelivery stack traces")
312        public Boolean getLogRetryStackTrace() {
313            if (!isSupportRedelivery()) {
314                return null;
315            }
316    
317            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
318            return redelivery.getRedeliveryPolicy().isLogRetryStackTrace();
319        }
320    
321        @ManagedAttribute(description = "RedeliveryPolicy for logging redelivery stack traces")
322        public void setLogRetryStackTrace(Boolean log) {
323            if (!isSupportRedelivery()) {
324                throw new IllegalArgumentException("This error handler does not support redelivery");
325            }
326    
327            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
328            redelivery.getRedeliveryPolicy().setLogRetryStackTrace(log);
329        }
330    
331        @ManagedAttribute(description = "RedeliveryPolicy for using collision avoidance")
332        public Boolean getUseCollisionAvoidance() {
333            if (!isSupportRedelivery()) {
334                return null;
335            }
336    
337            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
338            return redelivery.getRedeliveryPolicy().isUseCollisionAvoidance();
339        }
340    
341        @ManagedAttribute(description = "RedeliveryPolicy for using collision avoidance")
342        public void setUseCollisionAvoidance(Boolean avoidance) {
343            if (!isSupportRedelivery()) {
344                throw new IllegalArgumentException("This error handler does not support redelivery");
345            }
346    
347            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
348            redelivery.getRedeliveryPolicy().setUseCollisionAvoidance(avoidance);
349        }
350    
351        @ManagedAttribute(description = "RedeliveryPolicy for using exponential backoff")
352        public Boolean getUseExponentialBackOff() {
353            if (!isSupportRedelivery()) {
354                return null;
355            }
356    
357            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
358            return redelivery.getRedeliveryPolicy().isUseExponentialBackOff();
359        }
360    
361        @ManagedAttribute(description = "RedeliveryPolicy for using exponential backoff")
362        public void setUseExponentialBackOff(Boolean backoff) {
363            if (!isSupportRedelivery()) {
364                throw new IllegalArgumentException("This error handler does not support redelivery");
365            }
366    
367            RedeliveryErrorHandler redelivery = (RedeliveryErrorHandler) errorHandler;
368            redelivery.getRedeliveryPolicy().setUseExponentialBackOff(backoff);
369        }
370    
371    }