Hello,

I am experiencing an intermittent issue with WireTap on HTTP component based
routes.  I feel like I have exhausted my resources (both in the Camel
documentation, and on the forum) so I thought to post what I'm seeing.  I
will try to keep it as succint as possible.  Thanks in advance for reading
through this long post and trying to help me figure out what I'm doing
wrong.

*Camel Version - 2.9.2 (originally noticed it on 2.8.2 so tried upgrading to
the latest)*

*Overview:* Camel is being used to route, transform, and audit HTTP requests
with an XML payload.  Posts are made to a Servlet which marshals the request
to the appropriate Camel route through to the endpoint and back out through
the Servlet.  For auditing the WireTap component is used to asynchronously
log the XML requests and responses to a datastore.

*Route:*
<routes streamCache="false" xmlns="http://camel.apache.org/schema/spring";>
        <route id="/gateway/services/tax/ComputeTax">
                <from uri="direct:gateway/services/tax/ComputeTax"/>
                <bean ref="camelDefaultRequestProcessor"/>
                <wireTap uri="direct:gateway/services/LogRequest"/>
                <setHeader
headerName="serviceStaticId"><constant>919589842</constant></setHeader>
                <bean ref="camelAuthenticationRequestProcessor"/>
                <to uri="xslt:client/xslt/addSecurityNamespace.xsl"/>
                <to
uri="http://${SUBSTITUTE_SERVER_NAME}:${SUBSTITUTE_SERVER_PORT}/tax/services/ComputeTax?bridgeEndpoint=true&amp;transferException=true"/>
                <wireTap uri="direct:gateway/services/LogResponse">
                        <body><simple>${body}</simple></body>
                </wireTap>
                <onException>  
                
<exception>com.efleets.services.gateway.security.ServiceSecurityException</exception>
 
                        <redeliveryPolicy maximumRedeliveries="0"/>  
                        <handled><constant>true</constant></handled>  
                        <bean ref="camelFailureResponseStrategy"/>
                        <wireTap uri="direct:gateway/services/LogResponse">
                                <body><simple>${body}</simple></body>
                        </wireTap>
                </onException>
                <onException>  
                        
<exception>org.apache.camel.component.http.HttpOperationFailedException</exception>
 
                                 <redeliveryPolicy maximumRedeliveries="0"/>  
                                <handled><constant>true</constant></handled>  
                                <bean ref="camelFailureResponseStrategy"/>
                                <wireTap 
uri="direct:gateway/services/LogResponse">
                                        <body><simple>${body}</simple></body>
                                </wireTap>
                </onException>  
        </route>
</routes>

*The WireTap - "log" route:*
<routes xmlns="http://camel.apache.org/schema/spring";>
        <route id="/gateway/services/LogRequest">
                <from uri="direct:gateway/services/LogRequest"/>
                <bean ref="camelLogProcessor" method="logRequest"/>
                <to
uri="http://${SUBSTITUTE_SERVER_NAME}:${SUBSTITUTE_SERVER_PORT}/logging/services/Log?httpClient.soTimeout=5000&amp;bridgeEndpoint=true&amp;transferException=false"/>
        </route>
</routes>

*Issue:* 
The above routes work MOST of the time.  However, under Load conditions (X
number of transactions in varying intervals - 30s, 60s, etc.) a small but
varying percentage (sometimes 10% other times 0%) of the WireTap log
requests end up failing.  It is ALWAYS the response that fails to log (the
2nd WireTap).  Based on what I see in the debug the WireTap/Log route is
always executing, but for those that fail the payload coming to the
"camelLogProcessor" bean is NULL/EMPTY.  This causes the Log to fail.

*Here is a sample of the exception:*
/2012-04-25 20:50:10,417|DEBUG|desktop|||Camel (camelContext) thread #5 -
WireTapThread|impl.CamelLogProcessor|Start - CamelLogProcessor.logResponse()
2012-04-25 20:50:10,417|WARN|desktop|||Camel (camelContext) thread #5 -
WireTapThread|impl.CamelLogProcessor|LogResponse: XML Payload is null or
empty.  Unable to log the response for
transmissionId=da261865-1320-4a3c-a61e-c9c60e0fab5d
2012-04-25 20:50:10,433|ERROR|desktop|||Camel (camelContext) thread #5 -
WireTapThread|processor.DefaultErrorHandler|Failed delivery for (MessageId:
ID-2ua0270ghk-2665-1335404894183-0-6 on ExchangeId:
ID-2ua0270ghk-2665-1335404894183-0-7). Exhausted after delivery attempt: 1
caught: org.apache.camel.component.http.HttpOperationFailedException: HTTP
operation failed invoking http://<server:port>/logging/services/Log with
statusCode: 500/

I've tried a modified version of the route that utilizes a ThreadPool
specifically for the WireTap (by specifying an executorServiceRef on the
wireTap element), but in general the behavior is the same.  Note: I've
adjusted the poolSize, maxPoolSize, and etc but nothing seemed to help.

*Here is the ThreadPool:*
<threadPool id="wireTapThreadPool" threadName="WireTapThread" poolSize="10"
maxPoolSize="20" maxQueueSize="-1" rejectedPolicy="CallerRuns"/>

--
View this message in context: 
http://camel.465427.n5.nabble.com/Http-Route-with-WireTap-Question-Issue-tp5666526p5666526.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to