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 */
017package org.apache.camel.processor;
018
019import java.util.concurrent.ScheduledExecutorService;
020
021import org.apache.camel.CamelContext;
022import org.apache.camel.Exchange;
023import org.apache.camel.Predicate;
024import org.apache.camel.Processor;
025import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;
026import org.apache.camel.util.CamelLogger;
027
028/**
029 * Implements a <a
030 * href="http://camel.apache.org/dead-letter-channel.html">Dead Letter
031 * Channel</a> after attempting to redeliver the message using the
032 * {@link RedeliveryPolicy}
033 *
034 * @version 
035 */
036public class DeadLetterChannel extends RedeliveryErrorHandler {
037
038    /**
039     * Creates the dead letter channel.
040     *
041     * @param camelContext                  the camel context
042     * @param output                        outer processor that should use this dead letter channel
043     * @param logger                        logger to use for logging failures and redelivery attempts
044     * @param redeliveryProcessor           an optional processor to run before redelivery attempt
045     * @param redeliveryPolicy              policy for redelivery
046     * @param exceptionPolicyStrategy       strategy for onException handling
047     * @param deadLetter                    the failure processor to send failed exchanges to
048     * @param deadLetterUri                 an optional uri for logging purpose
049     * @param deadLetterHandleException     whether dead letter channel should handle (and ignore) exceptions which may be thrown during sending the message to the dead letter endpoint
050     * @param useOriginalBodyPolicy         should the original IN body be moved to the dead letter queue or the current exchange IN body?
051     * @param retryWhile                    retry while
052     * @param executorService               the {@link java.util.concurrent.ScheduledExecutorService} to be used for redelivery thread pool. Can be <tt>null</tt>.
053     * @param onPrepareProcessor            a custom {@link org.apache.camel.Processor} to prepare the {@link org.apache.camel.Exchange} before
054     *                                      handled by the failure processor / dead letter channel.
055     * @param onExceptionOccurredProcessor  a custom {@link org.apache.camel.Processor} to process the {@link org.apache.camel.Exchange} just after an exception was thrown.
056     */
057    public DeadLetterChannel(CamelContext camelContext, Processor output, CamelLogger logger, Processor redeliveryProcessor, RedeliveryPolicy redeliveryPolicy,
058            ExceptionPolicyStrategy exceptionPolicyStrategy, Processor deadLetter, String deadLetterUri, boolean deadLetterHandleException,
059            boolean useOriginalBodyPolicy, Predicate retryWhile, ScheduledExecutorService executorService, Processor onPrepareProcessor, Processor onExceptionOccurredProcessor) {
060
061        super(camelContext, output, logger, redeliveryProcessor, redeliveryPolicy, deadLetter, deadLetterUri, deadLetterHandleException,
062                useOriginalBodyPolicy, retryWhile, executorService, onPrepareProcessor, onExceptionOccurredProcessor);
063        setExceptionPolicy(exceptionPolicyStrategy);
064    }
065
066    public void process(Exchange exchange) throws Exception {
067        // just to let the stack trace reveal that this is a dead letter channel
068        super.process(exchange);
069    }
070
071    @Override
072    public String toString() {
073        if (output == null) {
074            // if no output then don't do any description
075            return "";
076        }
077        return "DeadLetterChannel[" + output + ", " + (deadLetterUri != null ? deadLetterUri : deadLetter) + "]";
078    }
079
080    @Override
081    protected boolean isRunAllowedOnPreparingShutdown() {
082        // allow tu run as we want to move the message eto DLC, instead of rejecting the message
083        return true;
084    }
085
086    @Override
087    public boolean isDeadLetterChannel() {
088        return true;
089    }
090}