public abstract class RedeliveryErrorHandler extends ErrorHandlerSupport implements AsyncProcessor, ShutdownPrepared, Navigate<Processor>
Modifier and Type | Class and Description |
---|---|
protected class |
RedeliveryErrorHandler.RedeliveryData
Contains the current redelivery data
|
Modifier and Type | Field and Description |
---|---|
protected AsyncProcessorAwaitManager |
awaitManager |
protected CamelContext |
camelContext |
protected boolean |
customExchangeFormatter |
protected Processor |
deadLetter |
protected boolean |
deadLetterHandleNewException |
protected String |
deadLetterUri |
protected ExchangeFormatter |
exchangeFormatter |
protected ScheduledExecutorService |
executorService |
protected CamelLogger |
logger |
protected Processor |
onExceptionProcessor |
protected Processor |
onPrepareProcessor |
protected Processor |
output |
protected AsyncProcessor |
outputAsync |
protected boolean |
preparingShutdown |
protected boolean |
redeliveryEnabled |
protected RedeliveryPolicy |
redeliveryPolicy |
protected Processor |
redeliveryProcessor |
protected AtomicInteger |
redeliverySleepCounter |
protected Predicate |
retryWhilePolicy |
protected boolean |
useOriginalMessagePolicy |
exceptionPolicies, exceptionPolicy, log
shutdown, shuttingdown, started, starting, stopped, stopping, suspended, suspending
Constructor and Description |
---|
RedeliveryErrorHandler(CamelContext camelContext,
Processor output,
CamelLogger logger,
Processor redeliveryProcessor,
RedeliveryPolicy redeliveryPolicy,
Processor deadLetter,
String deadLetterUri,
boolean deadLetterHandleNewException,
boolean useOriginalMessagePolicy,
Predicate retryWhile,
ScheduledExecutorService executorService,
Processor onPrepareProcessor,
Processor onExceptionProcessor) |
Modifier and Type | Method and Description |
---|---|
void |
changeOutput(Processor output)
Allows to change the output of the error handler which are used when optimising the
JMX instrumentation to use either an advice or wrapped processor when calling a processor.
|
protected Exchange |
defensiveCopyExchangeIfNeeded(Exchange exchange)
Performs a defensive copy of the exchange if needed
|
protected boolean |
deliverToFailureProcessor(Processor processor,
boolean isDeadLetterChannel,
Exchange exchange,
RedeliveryErrorHandler.RedeliveryData data,
AsyncCallback callback)
All redelivery attempts failed so move the exchange to the dead letter queue
|
protected void |
deliverToOnRedeliveryProcessor(Exchange exchange,
RedeliveryErrorHandler.RedeliveryData data)
Gives an optional configured redelivery processor a chance to process before the Exchange
will be redelivered.
|
boolean |
determineIfRedeliveryIsEnabled()
Determines if redelivery is enabled by checking if any of the redelivery policy
settings may allow redeliveries.
|
protected long |
determineRedeliveryDelay(Exchange exchange,
RedeliveryPolicy redeliveryPolicy,
long redeliveryDelay,
int redeliveryCounter)
Determines the redelivery delay time by first inspecting the Message header
Exchange.REDELIVERY_DELAY
and if not present, defaulting to RedeliveryPolicy.calculateRedeliveryDelay(long, int) |
protected void |
doShutdown()
Implementations override this method to perform customized shutdown.
|
protected void |
doStart()
Implementations override this method to support customized start/stop.
|
protected void |
doStop()
Implementations override this method to support customized start/stop.
|
Processor |
getDeadLetter()
Returns the dead letter that message exchanges will be sent to if the
redelivery attempts fail
|
String |
getDeadLetterUri() |
protected Predicate |
getDefaultHandledPredicate() |
CamelLogger |
getLogger() |
Processor |
getOutput()
Returns the output processor
|
int |
getPendingRedeliveryCount()
Gets the number of exchanges that are pending for redelivery
|
RedeliveryPolicy |
getRedeliveryPolicy() |
protected void |
handleException(Exchange exchange,
RedeliveryErrorHandler.RedeliveryData data,
boolean isDeadLetterChannel) |
boolean |
hasNext()
Are there more outputs?
Important only invoke this once, as this method do not carry state, and is not intended to be used in a while loop,
but used by a if statement instead.
|
protected boolean |
isCancelledOrInterrupted(Exchange exchange)
Strategy to determine if the exchange was cancelled or interrupted
|
boolean |
isDeadLetterHandleNewException() |
protected boolean |
isDone(Exchange exchange)
Strategy to determine if the exchange is done so we can continue
|
protected boolean |
isRedeliveryAllowed(RedeliveryErrorHandler.RedeliveryData data) |
protected boolean |
isRunAllowed(RedeliveryErrorHandler.RedeliveryData data) |
protected boolean |
isRunAllowedOnPreparingShutdown() |
boolean |
isUseOriginalMessagePolicy() |
List<Processor> |
next()
Next group of outputs
Important only invoke this once, as this method do not carry state, and is not intended to be used in a while loop,
but used by a if statement instead.
|
protected void |
onExceptionOccurred(Exchange exchange,
RedeliveryErrorHandler.RedeliveryData data)
Gives an optional configured OnExceptionOccurred processor a chance to process just after an exception
was thrown while processing the Exchange.
|
protected void |
prepareExchangeAfterFailure(Exchange exchange,
RedeliveryErrorHandler.RedeliveryData data,
boolean isDeadLetterChannel,
boolean shouldHandle,
boolean shouldContinue) |
protected void |
prepareExchangeForContinue(Exchange exchange,
RedeliveryErrorHandler.RedeliveryData data,
boolean isDeadLetterChannel) |
protected void |
prepareExchangeForRedelivery(Exchange exchange,
RedeliveryErrorHandler.RedeliveryData data) |
void |
prepareShutdown(boolean suspendOnly,
boolean forced)
Prepares for stop/shutdown.
|
void |
process(Exchange exchange)
Processes the message exchange
|
boolean |
process(Exchange exchange,
AsyncCallback callback)
Process the exchange using redelivery error handling.
|
protected void |
processAsyncErrorHandler(Exchange exchange,
AsyncCallback callback,
RedeliveryErrorHandler.RedeliveryData data)
This logic is only executed if we have to retry redelivery asynchronously, which have to be done from the callback.
|
protected boolean |
shouldHandleException(Exchange exchange)
Strategy whether the exchange has an exception that we should try to handle.
|
boolean |
supportTransacted()
Whether this error handler supports transacted exchanges or not.
|
addExceptionPolicy, createDefaultExceptionPolicyStrategy, createExceptionClasses, getExceptionPolicy, isDeadLetterChannel, setExceptionPolicy
addChildService, removeChildService, shutdown, start, start, stop
doResume, doSuspend, getStatus, getVersion, isRunAllowed, isStarted, isStarting, isStopped, isStopping, isStoppingOrStopped, isSuspended, isSuspending, isSuspendingOrSuspended, resume, suspend
protected final AtomicInteger redeliverySleepCounter
protected ScheduledExecutorService executorService
protected final CamelContext camelContext
protected final AsyncProcessorAwaitManager awaitManager
protected final Processor deadLetter
protected final String deadLetterUri
protected final boolean deadLetterHandleNewException
protected AsyncProcessor outputAsync
protected final Processor redeliveryProcessor
protected final RedeliveryPolicy redeliveryPolicy
protected final Predicate retryWhilePolicy
protected final CamelLogger logger
protected final boolean useOriginalMessagePolicy
protected boolean redeliveryEnabled
protected volatile boolean preparingShutdown
protected final ExchangeFormatter exchangeFormatter
protected final boolean customExchangeFormatter
protected final Processor onPrepareProcessor
protected final Processor onExceptionProcessor
public RedeliveryErrorHandler(CamelContext camelContext, Processor output, CamelLogger logger, Processor redeliveryProcessor, RedeliveryPolicy redeliveryPolicy, Processor deadLetter, String deadLetterUri, boolean deadLetterHandleNewException, boolean useOriginalMessagePolicy, Predicate retryWhile, ScheduledExecutorService executorService, Processor onPrepareProcessor, Processor onExceptionProcessor)
public void changeOutput(Processor output)
public boolean supportTransacted()
ErrorHandlerSupport
supportTransacted
in class ErrorHandlerSupport
public boolean hasNext()
Navigate
public List<Processor> next()
Navigate
protected boolean isRunAllowed(RedeliveryErrorHandler.RedeliveryData data)
protected boolean isRunAllowedOnPreparingShutdown()
protected boolean isRedeliveryAllowed(RedeliveryErrorHandler.RedeliveryData data)
public void prepareShutdown(boolean suspendOnly, boolean forced)
ShutdownPrepared
ShutdownStrategy
supports preparing for shutdown using two steps.
First a regular preparation, where the given forced parameter will be false.
And if the shutdown times out, then the ShutdownStrategy
performs a more aggressive
shutdown, calling this method a second time with true for the given forced parameter.
For example by graceful stopping any threads or the likes.
In addition a service can also be suspended (not stopped), and when this happens the parameter
suspendOnly has the value true. This can be used to prepare the service
for suspension, such as marking a worker thread to skip action.
For forced shutdown, then the service is expected to aggressively shutdown any child services, such
as thread pools etc. This is the last chance it has to perform such duties.prepareShutdown
in interface ShutdownPrepared
suspendOnly
- true if the intention is to only suspend the service, and not stop/shutdown the service.forced
- true is forcing a more aggressive shutdown, false is for preparing to shutdown.public void process(Exchange exchange) throws Exception
Processor
public boolean process(Exchange exchange, AsyncCallback callback)
process
in interface AsyncProcessor
exchange
- the message exchangecallback
- the AsyncCallback
will be invoked when the processing of the exchange is completed.
If the exchange is completed synchronously, then the callback is also invoked synchronously.
The callback should therefore be careful of starting recursive loop.protected long determineRedeliveryDelay(Exchange exchange, RedeliveryPolicy redeliveryPolicy, long redeliveryDelay, int redeliveryCounter)
Determines the redelivery delay time by first inspecting the Message header Exchange.REDELIVERY_DELAY
and if not present, defaulting to RedeliveryPolicy.calculateRedeliveryDelay(long, int)
In order to prevent manipulation of the RedeliveryData state, the values of RedeliveryErrorHandler.RedeliveryData.redeliveryDelay
and RedeliveryErrorHandler.RedeliveryData.redeliveryCounter
are copied in.
exchange
- The current exchange in question.redeliveryPolicy
- The RedeliveryPolicy to use in the calculation.redeliveryDelay
- The default redelivery delay from RedeliveryDataredeliveryCounter
- The redeliveryCounterprotected void processAsyncErrorHandler(Exchange exchange, AsyncCallback callback, RedeliveryErrorHandler.RedeliveryData data)
protected Exchange defensiveCopyExchangeIfNeeded(Exchange exchange)
exchange
- the exchangeprotected boolean shouldHandleException(Exchange exchange)
protected boolean isDone(Exchange exchange)
protected boolean isCancelledOrInterrupted(Exchange exchange)
public Processor getOutput()
getOutput
in class ErrorHandlerSupport
public Processor getDeadLetter()
public String getDeadLetterUri()
public boolean isUseOriginalMessagePolicy()
public boolean isDeadLetterHandleNewException()
public RedeliveryPolicy getRedeliveryPolicy()
public CamelLogger getLogger()
protected Predicate getDefaultHandledPredicate()
protected void prepareExchangeForContinue(Exchange exchange, RedeliveryErrorHandler.RedeliveryData data, boolean isDeadLetterChannel)
protected void prepareExchangeForRedelivery(Exchange exchange, RedeliveryErrorHandler.RedeliveryData data)
protected void handleException(Exchange exchange, RedeliveryErrorHandler.RedeliveryData data, boolean isDeadLetterChannel)
protected void onExceptionOccurred(Exchange exchange, RedeliveryErrorHandler.RedeliveryData data)
protected void deliverToOnRedeliveryProcessor(Exchange exchange, RedeliveryErrorHandler.RedeliveryData data)
protected boolean deliverToFailureProcessor(Processor processor, boolean isDeadLetterChannel, Exchange exchange, RedeliveryErrorHandler.RedeliveryData data, AsyncCallback callback)
protected void prepareExchangeAfterFailure(Exchange exchange, RedeliveryErrorHandler.RedeliveryData data, boolean isDeadLetterChannel, boolean shouldHandle, boolean shouldContinue)
public boolean determineIfRedeliveryIsEnabled() throws Exception
Exception
- can be thrownpublic int getPendingRedeliveryCount()
protected void doStart() throws Exception
ServiceSupport
ServiceSupport.doStop()
for more details.doStart
in class ServiceSupport
Exception
ServiceSupport.doStop()
protected void doStop() throws Exception
ServiceSupport
ServiceSupport.doStop()
method when
the service is being stopped. This method will also be invoked
if the service is still in uninitialized state (eg has not
been started). The method is always called to allow the service
to do custom logic when the service is being stopped, such as when
CamelContext
is shutting down.doStop
in class ServiceSupport
Exception
ServiceSupport.doStart()
protected void doShutdown() throws Exception
ServiceSupport
doShutdown
in class ServiceSupport
Exception
Apache Camel