[ 
https://issues.apache.org/jira/browse/CAMEL-7490?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen resolved CAMEL-7490.
--------------------------------
    Resolution: Fixed

> Redelivery delay cannot be modified in asynchronous mode for multiple retries 
> with different redelivery intervals for each retry specified in 
> Exchange.REDELIVERY_DELAY header parameter.
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-7490
>                 URL: https://issues.apache.org/jira/browse/CAMEL-7490
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-core
>    Affects Versions: 2.12.2
>         Environment: Linux - JBOSS
>            Reporter: Ajay Kapoor
>            Assignee: Claus Ibsen
>            Priority: Minor
>             Fix For: 2.14.1, 2.15.0, 2.13.4
>
>
> My application needs to modify the redelivery delay at runtime, thereby 
> overriding the values set by the application during configuration /loading 
> time.
> The Redelivery delay for subsequent retries will have varied retry intervals 
> and it needs to be done asynchronously. As of the current implementation, 
> this is possible only in synchronous mode where by the thread handling the 
> message on a route sleeps for specified amount time and uses the 
> Exchange.REDELIVERY_DELAY header to populate the delay values for each 
> reattempt.
> Issue 1:
> In asynchronous mode, the Exchange.REDELIVERY_DELAY is used only in the first 
> attempt and the same value is used in subsequent attempts. 
> Issue 2:
> There is no mechanism to set the delayPattern value if set for Redelivery 
> Policy at runtime. Need to have some mechanism where the DELAY_PATTERN can be 
> passed via Exchange at runtime such that it gets used for retries 
> asynchronously.
> Possible Fix::
> -----------------
> Issue-1:
>  org.apache.camel.processor:: RedeliveryErrorHandler
> ---------------------------------------------------------------------
> In the method (processAsyncErrorHandler) below, the code calls 
> calculateRedeliveryDelay() API for calculating the redelivery delay which is 
> wrong.  It should be calling the wrapper API - determineRedeliveryDelay() in 
> its place which will allow the usage of Exchange.REDELIVERY_DELAY being 
> passed in the headers. That way, it will allow the user to have the complete 
> asynchronous behavior based on the values being passed to the CAMEL at 
> runtime.
> The following code points to the bug exists::
> public abstract class RedeliveryErrorHandler extends ErrorHandlerSupport 
> implements AsyncProcessor, ShutdownPrepared {
> ...........
>     private class AsyncRedeliveryTask implements Callable<Boolean> {
> ..............
>     protected void processAsyncErrorHandler(final Exchange exchange, final 
> AsyncCallback callback, final RedeliveryData data) {
> ..............
>         if (data.redeliveryCounter > 0) {
>             // we are doing a redelivery then a thread pool must be 
> configured (see the doStart method)
>             ObjectHelper.notNull(executorService, "Redelivery is enabled but 
> ExecutorService has not been configured.", this);
>             // let the RedeliverTask be the logic which tries to redeliver 
> the Exchange which we can used a scheduler to
>             // have it being executed in the future, or immediately
>             // Note: the data.redeliverFromSync should be kept as is, in case 
> it was enabled previously
>             // to ensure the callback will continue routing from where we left
>             AsyncRedeliveryTask task = new AsyncRedeliveryTask(exchange, 
> callback, data);
>             // calculate the redelivery delay
>             data.redeliveryDelay = 
> data.currentRedeliveryPolicy.calculateRedeliveryDelay(data.redeliveryDelay, 
> data.redeliveryCounter);
>             if (data.redeliveryDelay > 0) {
>                 // schedule the redelivery task
>                 if (log.isTraceEnabled()) {
>                     log.trace("Scheduling redelivery task to run in {} millis 
> for exchangeId: {}", data.redeliveryDelay, exchange.getExchangeId());
>                 }
>                 executorService.schedule(task, data.redeliveryDelay, 
> TimeUnit.MILLISECONDS);
>             } else {
>                 // execute the task immediately
>                 executorService.submit(task);
>             }
>         }
>     }
> }
> }



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to