[
https://issues.apache.org/jira/browse/CAMEL-4760?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13166209#comment-13166209
]
Sergey Zhemzhitsky commented on CAMEL-4760:
-------------------------------------------
Here is the unit test that proves asyncDelayedRedelivery can be used with
logging error handler.
{code:title=AsyncDelayedRedeliveryLogErrorHandlerTest.java}
package org.foo.bar;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.processor.RedeliveryPolicy;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import javax.naming.Context;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class AsyncDelayedRedeliveryLogErrorHandlerTest extends CamelTestSupport
{
@Test
public void asyncRedeliveryTimer() throws Exception {
context().addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.to("seda:next?waitForTaskToComplete=Never&size=10");
from("seda:next")
.errorHandler(loggingErrorHandler())
.onException(Exception.class)
.redeliveryPolicyRef("redeliveryPolicy")
.handled(true)
.to("mock:exception")
.end()
.process(new Processor() {
private AtomicInteger counter = new AtomicInteger();
@Override
public void process(Exchange exchange) throws Exception
{
if (counter.compareAndSet(1, 2)) {
exchange.setProperty("ThrowException",
Boolean.TRUE);
exchange.getIn().setBody(counter.get() - 1);
} else {
exchange.getIn().setBody(counter.getAndIncrement());
}
}
})
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception
{
if
(Boolean.TRUE.equals(exchange.getProperty("ThrowException", Boolean.class))) {
exchange.removeProperty("ThrowException");
throw new RuntimeException("Test Exception!");
}
}
})
.to("mock:result");
}
});
MockEndpoint result = getMockEndpoint("mock:result");
result.expectedMessageCount(5);
result.allMessages().property("ThrowException").isNull();
// the 2nd sent message must be delivered 5th
result.message(4).body().isEqualTo(1);
// ensure there is no delay between the 1st and the 3rd sent messages
result.message(1).arrives().noLaterThan(100).millis().afterPrevious();
startCamelContext();
for(int i = 0; i < 5; i++) {
sendBody("direct:start", i);
}
assertMockEndpointsSatisfied(10, TimeUnit.SECONDS);
}
@Override
protected Context createJndiContext() throws Exception {
Context jndiContext = super.createJndiContext();
RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
redeliveryPolicy.setAsyncDelayedRedelivery(true);
redeliveryPolicy.setMaximumRedeliveries(1);
redeliveryPolicy.setRedeliveryDelay(5000);
jndiContext.bind("redeliveryPolicy", redeliveryPolicy);
return jndiContext;
}
@Override
public boolean isUseRouteBuilder() {
return false;
}
}
{code}
Please take a loot at assertions:
{code}
// the 2nd sent message must be delivered 5th
result.message(4).body().isEqualTo(1);
// ensure there is no delay between the 1st and the 3rd sent messages
result.message(1).arrives().noLaterThan(100).millis().afterPrevious();
{code}
The 2nd sent message is delivered 5th because of redelivery and the 2nd
delivered message which is equal to 3rd sent message arrives no later than 100
millis after the first delivered message although _redeliveryDelay_ is equal to
5 seconds. That means I can configure async. redelivery with logging error
handler, so I have two questions:
# If I can configure async. redelivery with logging error handler why I cannot
specify custom executor service, although logging error handler extends default
error handler?
# Is it possible to specify logName for default error handler, because it seems
that spring dsl does not allow to specify logName for loggers although java dsl
does?
> Unable to set logName on DefaultErrorHandler as well as executorService on
> LoggingErrorHandler
> ----------------------------------------------------------------------------------------------
>
> Key: CAMEL-4760
> URL: https://issues.apache.org/jira/browse/CAMEL-4760
> Project: Camel
> Issue Type: Improvement
> Components: camel-spring
> Affects Versions: 2.8.3
> Reporter: Sergey Zhemzhitsky
> Assignee: Claus Ibsen
> Priority: Minor
> Fix For: 2.8.4, 2.9.0
>
>
> The following snippets do not work, although each of the specified error
> handlers supports _logName_ and _executorServiceRef_. The issue is actual for
> the _DeadLetterChannel_ error handler too.
> {code:title=LoggingErrorHandler}
> <errorHandler id="errorHandler" type="LoggingErrorHandler"
> logName="${router.logger.name}" executorServiceRef="redeliveryExecutor"/>
> {code}
> {code:title=DefaultErrorHandler}
> <errorHandler id="errorHandler" type="DefaultErrorHandler"
> logName="${router.logger.name}" executorServiceRef="redeliveryExecutor"/>
> {code}
> {code:title=StackTrace}
> Caused by: org.springframework.beans.factory.BeanDefinitionStoreException:
> Unexpected exception parsing XML document from class path resource
> [META-INF/spring/camel-context.xml]; nested exception is
> java.lang.IllegalArgumentException: Attribute executorServiceRef is not
> supported by error handler type: LoggingErrorHandler, in error handler with
> id: errorHandler
> at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)
> at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
> at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
> at
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
> at
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
> at
> org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:186)
> ... 42 more
> Caused by: java.lang.IllegalArgumentException: Attribute executorServiceRef
> is not supported by error handler type: LoggingErrorHandler, in error handler
> with id: errorHandler
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira