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}