Uploaded image for project: 'Red Hat Fuse'
  1. Red Hat Fuse
  2. ENTESB-2612

camel-netty mixes the contents of different connections when consuming XMLs larger than 2KB under high concurrency

    XMLWordPrintable

    Details

    • 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

      Description

      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());
      	}
      }
      

        Gliffy Diagrams

          Attachments

            Activity

              People

              • Assignee:
                willem.jiang Willem Jiang
                Reporter:
                iweiss Ingo Weiss
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: