Hi Freeman, thanks for the suggestion.
I tried that and am seeing the same results. After consulting the Camel
documentation about stream caching at
http://camel.apache.org/stream-caching.html I tried various flavors of
specifying it (e.g., specifying streamCache="true" on camelContext and
streamCaching="true" and streamCache="true" on route)...none of those helped.
I also tried removing the <to> element for the log message, and that didn't
help either.
It's like in the case of both <to uri="log..."> and <to uri="file..."> the
stream from the jbi: endpoint is getting cut off after 1000-2000 bytes. Very
strange.
I set the log level to DEBUG, and I get a big nested stack trace at the
expected place, with this as the last exception listed:
Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected end of input block in
start tag
at [row,col {unknown-source}]: [51,20]
at
com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOB(StreamScanner.java:696)
at
com.ctc.wstx.sr.StreamScanner.loadMoreFromCurrent(StreamScanner.java:1062)
at
com.ctc.wstx.sr.StreamScanner.getNextCharFromCurrent(StreamScanner.java:807)
at
com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2892)
at
com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2783)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1048)
at
org.apache.servicemix.soap.util.stax.FragmentStreamReader.next(FragmentStreamReader.java:68)
at
org.apache.servicemix.cxfbc.interceptors.StaxJbiWrapper.next(StaxJbiWrapper.java:166)
at
org.apache.servicemix.soap.util.stax.StaxSource.parse(StaxSource.java:116)
... 54 more
Incidentally, the first exception (top of the stack) is this:
org.apache.camel.InvalidPayloadException: No body available of type:
java.lang.String but has value:
org.apache.servicemix.soap.util.stax.StaxSource@4f6a4207 of type:
org.apache.servicemix.soap.util.stax.StaxSource on: Message:
org.apache.servicemix.soap.util.stax.StaxSource@4f6a4207. Caused by: No type
converter available to convert from type:
org.apache.servicemix.soap.util.stax.StaxSource to the required type:
java.lang.String with value
org.apache.servicemix.soap.util.stax.StaxSource@4f6a4207. Exchange[Message:
org.apache.servicemix.soap.util.stax.StaxSource@4f6a4207]. Caused by:
[org.apache.camel.NoTypeConversionAvailableException - No type converter
available to convert from type: org.apache.servicemix.soap.util.stax.StaxSource
to the required type: java.lang.String with value
org.apache.servicemix.soap.util.stax.StaxSource@4f6a4207]
at
org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:103)
at
org.apache.camel.processor.ConvertBodyProcessor.process(ConvertBodyProcessor.java:57)
at
org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:68)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at
org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:99)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:68)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:290)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:202)
at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:256)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:143)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:78)
at
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:99)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:68)
at
org.apache.servicemix.camel.CamelProviderEndpoint$1.call(CamelProviderEndpoint.java:109)
at
org.apache.servicemix.camel.JbiBinding.runWithCamelContextClassLoader(JbiBinding.java:116)
at
org.apache.servicemix.camel.CamelProviderEndpoint.handleActiveProviderExchange(CamelProviderEndpoint.java:107)
at
org.apache.servicemix.camel.CamelProviderEndpoint.process(CamelProviderEndpoint.java:85)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:651)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:606)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchangeInTx(AsyncBaseLifeCycle.java:501)
at
org.apache.servicemix.common.AsyncBaseLifeCycle$2.run(AsyncBaseLifeCycle.java:370)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Any other ideas?
Thanks.
--Scott
-----Original Message-----
From: Freeman Fang [mailto:[email protected]]
Sent: Monday, January 17, 2011 7:08 PM
To: [email protected]
Subject: Re: Large(ish) message issue (CXFBC and Camel)
On 2011-1-18, at 上午10:41, Scott Came wrote:
> I am seeing some strange behavior when using Camel to route from a JBI
> endpoint (cxfbc) to a file using the Camel file component.
>
> Here is the scenario.
>
> I have created a JBI CXFBC service unit with WSDL. I have also
> created a Camel service unit, with a very simple route: it routes
> from the CXFBC endpoint to a file with a route that looks like this:
>
> <camelContext id="camel" xmlns="http://camel.apache.org/schema/
> spring">
> <route>
> <from
> uri="jbi:endpoint:http://it.ojp.gov/global/services/tsc-encounter-rout
> er/RouterService/RouterServiceEndpoint
> "/>
> <to uri="log:gov.ojp.it.TSCEncounterRouterLog?showBody=false"/>
> <convertBodyTo type="java.lang.String"/>
> <to uri="file:/Users/scott/Desktop/router-output"/>
> </route>
> </camelContext>
>
> I bundle these to SUs into an SA and deploy. Everything deploys fine.
>
> I then use SOAPUI to send test messages.
>
> If I send a very small message...say, no bigger than a couple
> hundred bytes, to the RouterServiceEndpoint, everything works fine.
> I see the log message in the log, and the file gets written to my
> router-output directory.
>
> However, when I increase the message size beyond a certain point (not
> sure exactly where it is...somewhere around 2000-3000 bytes) I start
> getting messages like:
>
> Unexpected end of input block in start tag at [row,col {unknown-
> source}]: [51,20]
>
> The underlying exception seems to be a
> com.ctc.wstx.exc.WstcEOFException.
>
> If I try subsequent invocations of the service, I get a similar error,
> though the referenced place in the stream is often a little different
> (e.g., [51, 25] or [55, 10]). So it seems like the parser is getting
> to a different place in the stream each time before it fails.
>
> I have put TCPMon in the middle and verified that the entire message
> is getting to the server, although the server side is not closing the
> connection when the exception occurs.
>
> I am 100% sure the content being sent is valid XML.
>
> Interestingly, if I take out the <to> part of the route to the file
> component, everything works fine...I get the simple log message (note
> that I am not logging the body content), and the connection closes in
> TCPMon. However, if I switch to logging the body content (i.e., take
> off the ?showBody=false option), I get similar errors as when I try to
> write out the file.
This looks like a stream already get consumed issue for me, how about you just
How about you just change your router like <camelContext id="camel"
xmlns="http://camel.apache.org/schema/spring">
<route streamCache="true" >
<from
uri="jbi:endpoint:http://it.ojp.gov/global/services/tsc-encounter-router/RouterService/RouterServiceEndpoint
"/>
<to uri="log:gov.ojp.it.TSCEncounterRouterLog?showBody=false"/>
<convertBodyTo type="java.lang.String"/>
<to uri="file:/Users/scott/Desktop/router-output"/>
</route>
</camelContext>
Freeman
> I have tried taking out the <convertBodyTo...> element, but that
> results in a different exception...something about no appropriate
> converter being found.
>
> It would be somewhat difficult for me to attach a full example, as the
> content of the large message is somewhat sensitive/proprietary, but I
> could do that if I absolutely needed to. I'm hoping there is some
> simple configuration setting I need to tweak to handle bigger messages
> (though a 2K or 3K message is by no means large...)
>
> Thanks for any help you can offer.
>
> --Scott
--
Freeman Fang
------------------------
FuseSource: http://fusesource.com
blog: http://freemanfang.blogspot.com
twitter: http://twitter.com/freemanfang
Apache Servicemix:http://servicemix.apache.org
Apache Cxf: http://cxf.apache.org
Apache Karaf: http://karaf.apache.org
Apache Felix: http://felix.apache.org