Hello,
I'm trying to set up a route that will FTP an XML file from a remote
server, pass it to an XSLT processor to convert it to a CSV file, then
FTP the CSV file up to another remote server. I had this working with
a vanilla install of ServiceMix 4.2.0 in our test environment. It
fails in our production environment, with the main difference being
that the production environment uses Camel FTP 2.3.0 instead of Camel
FTP 2.2.0. This is the error message I'm getting:
17:07:17,284 | ERROR | password=##### | DefaultErrorHandler
| rg.apache.camel.processor.Logger 248 | Failed delivery for
exchangeId: f14f5dec-d2bf-42cb-9348-57e4092e3bef. Exhausted after
delivery attempt: 1 caught:
org.apache.camel.ExpectedBodyTypeException: Could not extract IN
message body as type: interface javax.xml.transform.Source body is:
GenericFile[test.xml]
org.apache.camel.ExpectedBodyTypeException: Could not extract IN
message body as type: interface javax.xml.transform.Source body is:
GenericFile[test.xml]
With TRACE logging turned on, I can see the contents of the XML file
so I know it is being properly downloaded. It seems like the XSLT
processor does not know how to convert the XML file input into a
Source object. Here is the route that I'm using:
<camel:route>
<camel:from
uri="ftp://##...@#######/?password=######&passiveMode=true&binary=false&delay=6000&filter=#myfilter"/>
<camel:to uri="xslt:test-csv.xsl"/>
<camel:setHeader headerName="CamelFileName">
<camel:simple>${file:name.noext}.${date:now:yyyy-MM-dd-hh.mm.ss}.csv</camel:simple>
</camel:setHeader>
<camel:to
uri="ftp://#...@####:###/?password=####&passiveMode=true&binary=false&disconnect=true"/>
</camel:route>
The #myfilter URL parameter is selecting the file to download by
filename. This is working properly in both environments. In the test
environment where it was working, I had added this processor
immediately after the 'from' ftp component, before the XSLT processor:
<camel:setBody>
<camel:simple>${body}</camel:simple>
</camel:setBody>
This setBody processor sets the body of the message to the contents of
the file, which allowed the XSLT processor to properly process the
file's contents in the test environment. However, in my production
environment the setBody processor does not seem to fix this error.
I've tried writing a couple of Converters to convert a GenericFile to
a Source and also to a String, and also to convert a File to a Source
and a String but none of those seem to ever get called.
Any help would be appreciated. Thanks in advance,
Joe Brunner