Hi
I will split the "try to patch the file" code into a 2nd route as this
generally works better than deep nested route logic.
And then use direct endpoint to "link" the two routes.
> <!-- retry by trying to fix the xml -->
> <camel:to uri="bean:incidentValidate?method=filterBadUTFEncoding" />
Should then be
<camel:to uri="direct:pathAndRerty" />
<route>
<from uri="direct:patchAndRetry"/>
<camel:to uri="bean:incidentValidate?method=filterBadUTFEncoding" />
<!-- If unmarshal fails should the camel:onException catch Me -->
<camel:unmarshal ref="incidentJaxb" />
</route>
On Mon, Oct 5, 2009 at 9:24 AM, SoaMattH <[email protected]> wrote:
>
>
> The problem:
> Occasionally I am getting poorly formed XML and am trying to fixit on the
> fly.
> Most of the time I can, 1% of the time I cannot.
>
> In the route below this is what I want to do
> 1. pick up the file.
> 2. Use Jaxb to unmarshal
> 3. call the validate bean
> 4. call the incidentReceiverFile bean
> 5. on sucessfull completion the file ends up in a processed directory
> On failure it ends up in the dead letter folder.
>
> The route works well for well formed XML, if the unmarshal throws an error
> It calls the incidentValidate?method=filterBadUTFEncoding, most of the time
> this works
> except for when my filterBadUTFEncoding cannot fix the bad XML (Which is
> about 1% of the time)
> On this case I want the file to go to dead letter folder.
>
>
> The Route:
> <camel:route errorHandlerRef="incidentDeadLetter" id="incidentFileRouteA">
> <camel:from ref="incidentFileEndPoint" />
> <camel:doTry>
> <camel:unmarshal ref="incidentJaxb" />
> <camel:doCatch>
> <camel:exception>org.xml.sax.SAXParseException</camel:exception>
>
> <camel:exception>org.apache.xerces.impl.io.MalformedByteSequenceException</camel:exception>
> <camel:handled>
> <camel:constant>true</camel:constant>
> </camel:handled>
> <!-- retry by trying to fix the xml -->
> <camel:to uri="bean:incidentValidate?method=filterBadUTFEncoding" />
> <!-- If unmarshal fails should the camel:onException catch Me -->
> <camel:unmarshal ref="incidentJaxb" />
> </camel:doCatch>
> </camel:doTry>
>
> <camel:to uri="bean:incidentValidate?method=validate" />
> <camel:to uri="bean:incidentReceiverFile?method=processIncident" />
>
> <camel:onException useOriginalMessage="true" >
> <camel:exception>java.lang.Exception</camel:exception>
> <camel:redeliveryPolicy maximumRedeliveries="0" />
> <camel:handled>
> <camel:constant>true</camel:constant>
> </camel:handled>
> <camel:to
> uri="log:au.gov.qld.des.integration.oms.business.incident?level=FATAL"/>
> <camel:to uri="bean:incidentDeadLetter" />
> <camel:to uri="log:au.gov.qld.des?showAll=true&level=FATAL"/>
> </camel:onException>
> </camel:route>
>
>
> I am expecting the <camel:onException> to catch any errors out of the on
> catch retry ....
> is this so ? the file stays in the incidentFileEndPoint directory that the
> route watches and trys
> to process over and over ....... What am I missing ??
>
> Thanks Matt
>
> --
> View this message in context:
> http://www.nabble.com/Error-Handling%3A-mix-of-onTry...OnCatch-and-%3ConException%3E-tp25746191p25746191.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
>
--
Claus Ibsen
Apache Camel Committer
Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus