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:
69
6)
at
com.ctc.wstx.sr.StreamScanner.loadMoreFromCurrent(StreamScanner.
ja
v
a
:1
062)
at
com.ctc.wstx.sr.StreamScanner.getNextCharFromCurrent(StreamScanner.
j
av
a:807)
at
com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.
ja
va:2892)
at
com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:
2783)
at
com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:10
48
)
at
org.apache.servicemix.soap.util.stax.FragmentStreamReader.next(F
ra
g
m
en
tStreamReader.java:68)
at
org.apache.servicemix.cxfbc.interceptors.StaxJbiWrapper.next(Sta
xJ
b
i
Wr
apper.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(MessageSup
po
r
t
.j
ava:103)
at
org.apache.camel.processor.ConvertBodyProcessor.process(ConvertB
od
y
P
ro
cessor.java:57)
at
org.apache.camel.impl.converter.AsyncProcessorTypeConverter$Proc
es
s
o
rT
oAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcesso
rH
e
l
pe
r.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(De
le
g
a
te
AsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(Delega
te
A
s
yn
cProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(Ins
tr
u
m
en
tationProcessor.java:68)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcesso
rH
e
l
pe
r.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(De
le
g
a
te
AsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(Delega
te
A
s
yn
cProcessor.java:89)
at
org.apache.camel.processor.interceptor.TraceInterceptor.process(
Tr
a
c
eI
nterceptor.java:99)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcesso
rH
e
l
pe
r.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(De
le
g
a
te
AsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(Delega
te
A
s
yn
cProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(Ins
tr
u
m
en
tationProcessor.java:68)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcesso
rH
e
l
pe
r.java:70)
at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHa
nd
l
e
r(
RedeliveryErrorHandler.java:290)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(Redeli
ve
r
y
Er
rorHandler.java:202)
at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:
256)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcesso
rH
e
l
pe
r.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(UnitOfWor
kP
r
o
ce
ssor.java:99)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcesso
rH
e
l
pe
r.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(De
le
g
a
te
AsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(Delega
te
A
s
yn
cProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(Ins
tr
u
m
en
tationProcessor.java:68)
at
org.apache.servicemix.camel.CamelProviderEndpoint$1.call(CamelPr
ov
i
d
er
Endpoint.java:109)
at
org.apache.servicemix.camel.JbiBinding.runWithCamelContextClassL
oa
d
e
r(
JbiBinding.java:116)
at
org.apache.servicemix.camel.CamelProviderEndpoint.handleActivePr
ov
i
d
er
Exchange(CamelProviderEndpoint.java:107)
at
org.apache.servicemix.camel.CamelProviderEndpoint.process(CamelP
ro
v
i
de
rEndpoint.java:85)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncB
as
e
L
if
eCycle.java:651)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(
As
y
n
cB
aseLifeCycle.java:606)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchangeI
nT
x
(
As
yncBaseLifeCycle.java:501)
at
org.apache.servicemix.common.AsyncBaseLifeCycle$2.run(AsyncBaseL
if
e
C
yc
le.java:370)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoo
lE
x
e
cu
tor.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-encount
er
- r ou t 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-encounte
r- r o ut 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>
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