-
Type:
Bug
-
Status: Closed
-
Priority:
Critical
-
Resolution: Done
-
Affects Version/s: jboss-fuse-6.1
-
Fix Version/s: None
-
Component/s: None
-
Labels:None
-
Environment:
Fuse 6.1 R2P2
A camel-netty route with the following URI:
tcp.endpoint=netty:tcp://127.0.0.1:7890?textline=false&autoAppendDelimiter=false&delimiter=NULL&keepAlive=true&synchronous=false&orderedThreadPoolExecutor=false&decoderMaxLineLength=5000&disconnect=true&decoders=#delimiter-based-frame-decoder,#string-decoder&encoder=#string-encoder
|
And using a 2KB+ one-line XML file starts to insert contents from different connections in the same Exchange, causing exceptions like the following:
Stacktrace
|
---------------------------------------------------------------------------------------------------------------------------------------
|
org.apache.camel.builder.xml.InvalidXPathExpression: Invalid xpath: XML/ProcCode/text(). Reason: javax.xml.xpath.XPathExpressionException: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 2; The markup in the document preceding the root element must be well-formed.
|
at org.apache.camel.builder.xml.XPathBuilder.doInEvaluateAs(XPathBuilder.java:914)
|
at org.apache.camel.builder.xml.XPathBuilder.evaluateAs(XPathBuilder.java:778)
|
at org.apache.camel.builder.xml.XPathBuilder.evaluate(XPathBuilder.java:748)
|
at org.apache.camel.builder.xml.XPathBuilder.evaluate(XPathBuilder.java:168)
|
at org.apache.camel.builder.ProcessorBuilder$4.process(ProcessorBuilder.java:103)
|
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
|
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
|
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
|
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
|
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
|
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
|
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
|
at org.apache.camel.component.netty.handlers.ServerChannelHandler.processAsynchronously(ServerChannelHandler.java:136)
|
at org.apache.camel.component.netty.handlers.ServerChannelHandler.messageReceived(ServerChannelHandler.java:108)
|
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
|
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
|
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
|
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
|
at org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:70)
|
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
|
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
|
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
|
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)
|
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)
|
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:310)
|
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
|
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
|
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
|
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
|
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
|
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
|
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)
|
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:318)
|
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
|
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
|
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
|
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
|
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
|
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
|
at java.lang.Thread.run(Thread.java:745)
|
Caused by: javax.xml.xpath.XPathExpressionException: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 2; The markup in the document preceding the root element must be well-formed.
|
at net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:421)
|
at org.apache.camel.builder.xml.XPathBuilder.doInEvaluateAs(XPathBuilder.java:891)
|
... 39 more
|
Caused by: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 2; The markup in the docum[Fatal Error] :1:6978: XML document structures must start and end within the same entity.
|
Configuring jmeter to use 100 threads and 10 loops yields these results.
These are the encoders and decoders used:
<bean id="string-encoder" class="org.jboss.netty.handler.codec.string.StringEncoder"/> |
<bean id="string-decoder" class="org.jboss.netty.handler.codec.string.StringDecoder"/> |
|
|
<bean id="xmlDelimitter" class="XMLDelimitter"/> |
|
|
<bean id="delimiter-based-frame-decoder" class="org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder"> |
<constructor-arg value="${delimiter.based.frame.decoder.maxLength}"/> |
<!-- 100000 --> |
<constructor-arg value="${delimiter.based.frame.decoder.stripDelimiter}"/> |
<!-- false --> |
<constructor-arg value="#{xmlDelimitter.getXMLDelimiter()}"/> |
</bean> |
import java.nio.charset.Charset; |
|
|
import org.jboss.netty.buffer.ChannelBuffer; |
import org.jboss.netty.buffer.ChannelBuffers; |
|
|
public class XMLDelimitter { |
|
|
public ChannelBuffer getXMLDelimiter() { |
return ChannelBuffers.copiedBuffer("</XML>", Charset.defaultCharset()); |
}
|
}
|