Hi ,
I just dug the code, you can't set the errorHandler from CamelContext in
Camel1.4.0, I just fill a JIRA[1] for this issue.
You can walk around it by using the DSL.
[1]https://issues.apache.org/activemq/browse/CAMEL-751
Willem
mcobery wrote:
Hi,
I am attempting to upgrade from Camel 1.3 to Camel 1.4 so we can use its
exception handling features and configuration. I have been trying to
configure the DeadLetterChannel all day via errorHandlerRef attribute on the
Camel Context and on the route element within the Camel context to no avail.
My setup is as follows:
-Defined Spring configuration file that defines my Camel CXF endpoints and
Camel Context with its routes.
-Run the application through the Maven Jetty Plugin.
-Make a web service request via SOAPUI to the create method on the Archetype
Web Service with an error in XML payload of the request. This error in the
payload causes the JAXB unmarshall to pass null to the archetypeBSO bean
defined in Camel route.
-The DAO within the BSO throws an exception when it attempts to save a null
object.
-The stacktrace shows that the Camel Route is being followed but the
DeadLetterChannel configuration is not.
Any suggestions? What am I doing wrong? Any help will be greatly
appreciated.
Regards,
Marc
Here is my configuration.
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xmlns:cxf="http://activemq.apache.org/camel/schema/cxfEndpoint"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:camel="http://activemq.apache.org/camel/schema/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/camel/schema/cxfEndpoint
http://activemq.apache.org/camel/schema/cxfEndpoint/camel-cxf.xsd
http://activemq.apache.org/camel/schema/spring
http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
http://cxf.apache.org/bindings/soap
http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://activemq.apache.org/camel/schema/spring
http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/lang
http://www.springframework.org/schema/lang/spring-lang-2.5.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- ******************************************************************
-->
<!-- ********* CXF ENDPOINTS ********
-->
<!-- ******************************************************************
-->
<cxf:cxfEndpoint
id="archetypeService"
serviceClass="com.rulestream.ws.knowledge.ArchetypeWebService"
address="/ArchetypeService"
endpointName="t:ArchetypeService"
serviceName="t:archetypeService"
xmlns:t="http://core.rulestream.com">
</cxf:cxfEndpoint>
<!-- ******************************************************************
-->
<!-- ********* CXF ENDPOINTS ********
-->
<!-- ******************************************************************
-->
<!-- ******************************************************************
-->
<!-- ********* CAMEL ROUTING ********
-->
<!-- ******************************************************************
-->
<camel:camelContext id="main.context"
errorHandlerRef="cxfDeadLetterErrorHandler">
<camel:jmxAgent id="agent" disabled="true"/>
<camel:route>
<camel:from uri="cxf://bean:archetypeService" />
<camel:process ref="cxfIn" />
<camel:choice>
<camel:when>
<camel:groovy>exchange.in.headers.operationName ==
'create'</camel:groovy>
<camel:to uri="bean:archetypeBSO?methodName=create" />
<camel:process ref="archetypeProcessor" />
</camel:when>
<camel:when>
<camel:groovy>exchange.in.headers.operationName ==
'delete'</camel:groovy>
<camel:to uri="bean:archetypeBSO?methodName=delete" />
<camel:process ref="booleanProcessor" />
</camel:when>
<camel:when>
<camel:groovy>exchange.in.headers.operationName ==
'find'</camel:groovy>
<camel:to uri="bean:archetypeBSO?methodName=find" />
<camel:process ref="archetypeListProcessor" />
</camel:when>
<camel:when>
<camel:groovy>exchange.in.headers.operationName ==
'save'</camel:groovy>
<camel:to uri="bean:archetypeBSO?methodName=save" />
<camel:process ref="archetypeProcessor" />
</camel:when>
<camel:otherwise>
<camel:recipientList>
<camel:groovy>
'bean:archetypeBSO?methodName='+exchange.in.headers.operationName
</camel:groovy>
</camel:recipientList>
<camel:process ref="archetypeProcessor" />
</camel:otherwise>
</camel:choice>
<camel:to
uri="bean:facetSpecConverter?methodName=clearPreviouslyConvertedDTOs" />
<camel:to
uri="bean:facetSpecConverter?methodName=clearPreviouslyConvertedDomainObjects"
/>
<camel:to
uri="bean:facetSpecGraphBuilder?methodName=clearPreviouslyBuiltObjects" />
</camel:route>
</camel:camelContext>
<bean id="exceptionProcessor"
class="com.rulestream.ws.shared.processors.CxfOutExceptionProcessor"/>
<bean id="cxfDeadLetterErrorHandler"
class="org.apache.camel.builder.DeadLetterChannelBuilder">
<property name="defaultDeadLetterEndpointUri"
value="bean:exceptionProcessor" />
<property name="redeliveryPolicy" ref="rsRedeliveryPolicyConfig" />
</bean>
<bean id="rsRedeliveryPolicyConfig"
class="org.apache.camel.processor.RedeliveryPolicy">
<property name="maximumRedeliveries" value="1" />
<property name="initialRedeliveryDelay" value="30000"/>
<property name="useExponentialBackOff" value="true"/>
</bean>
<!-- ******************************************************************
-->
<!-- ********* CAMEL ROUTING ********
-->
<!-- ******************************************************************
-->
</beans>
Here is the stacktrace:
[RULESTREAM] ERROR [btpool0-1] BaseEntityBSO.create(124) | 60002 : Error
saving the version!!!!
[RULESTREAM] ERROR [btpool0-1] DeadLetterChannel.log(189) | Failed delivery
for exchangeId: ID-mcobery/3170-1216852528171/0-0. On delivery attempt: 5
caught: com.rulestream.core.shared.exceptions.RSRuntimeException: 60002 :
Error saving the version!!!!
com.rulestream.core.shared.exceptions.RSRuntimeException: 60002 : Error
saving the version!!!!
at
com.rulestream.core.shared.bso.BaseEntityBSO.create(BaseEntityBSO.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy76.create(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:124)
at
org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:68)
at
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:110)
at
org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:92)
at
org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:66)
at
org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:43)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:75)
at
org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:155)
at
org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:91)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:85)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:41)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:57)
at
org.apache.camel.processor.DelegateProcessor.processNext(DelegateProcessor.java:50)
at
org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:50)
at
org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:43)
at
org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:155)
at
org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:91)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:85)
at
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:39)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:41)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:66)
at
org.apache.camel.component.cxf.CamelInvoker.invoke(CamelInvoker.java:167)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:56)
at
org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:92)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
at
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:92)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:279)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:161)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:174)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java:152)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at
com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at
com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:164)
at
org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
at
org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
at
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:406)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
org.appfuse.webapp.filter.LocaleFilter.doFilterInternal(LocaleFilter.java:74)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
com.opensymphony.clickstream.ClickstreamFilter.doFilter(ClickstreamFilter.java:42)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:359)
at
org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at
org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:52)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:105)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.ui.rememberme.RememberMeProcessingFilter.doFilterHttp(RememberMeProcessingFilter.java:109)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.ui.basicauth.BasicProcessingFilter.doFilterHttp(BasicProcessingFilter.java:173)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:271)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
at
org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at
org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at
org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:174)
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
at
org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:842)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
Caused by: java.lang.NullPointerException
at
com.rulestream.core.shared.dao.GenericDAOImpl.save(GenericDAOImpl.java:68)
at
com.rulestream.core.shared.dao.GenericDAOImpl.save(GenericDAOImpl.java:1)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
com.rulestream.core.util.InvocationHandlerDelegate.invoke(InvocationHandlerDelegate.java:42)
at
com.rulestream.core.shared.dao.GenericDAOFactoryBean$GenericDAOInvocationHandler.invoke(GenericDAOFactoryBean.java:227)
at $Proxy56.save(Unknown Source)
at
com.rulestream.core.shared.bso.BaseEntityBSO.create(BaseEntityBSO.java:119)
... 120 more
[RULESTREAM] ERROR [btpool0-1] DeadLetterChannel.process(78) |
Exchange[BodyType:org.apache.xerces.dom.DocumentImpl, Body:<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:core="http://core.rulestream.com">
<soapenv:Header/>
<soapenv:Body/></soapenv:Envelope>]
Regards,
Marc