Issue Type: Bug Bug
Affects Versions: 0.7
Assignee: Unassigned
Components: component-camel
Created: 04/Mar/13 7:53 AM
Description:

See attached example, it is modified camel-soap-proxy with one change - there are two Camel components instead of one that are chained.

Each component contains two log messages. The example does not work because the first camel implementation converts the message body into ByteArrayInputStream.

When the second component access the body it consumes the InputStream but the consumption is done every time the body is accessed. Unfortunately there is no reset between InputStream reads which means that the body is no longer accessible.

The log file analysis shows

First component

  • body is converted to String and first message is printed
    13:48:19,063 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Using converter: InstanceMethodTypeConverter: public java.lang.String org.apache.camel.converter.jaxp.XmlConverter.toString(javax.xml.transform.Source,org.apache.camel.Exchange) throws javax.xml.transform.TransformerException to convert [class javax.xml.transform.dom.DOMSource=>class java.lang.String]
    13:48:19,064 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) Processing exchangeId: ID-jpechane-46610-1362401256407-0-3 >>> Exchange[Message: <urn:reverse xmlns:urn="urn:switchyard-quickstart:camel-soap-proxy:1.0">
             <!--Optional:-->
             <text>My message</text>
          </urn:reverse>]
    13:48:19,065 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 1 - First log: 
    13:48:19,066 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting javax.xml.transform.dom.DOMSource -> java.lang.String with value: javax.xml.transform.dom.DOMSource@55eb830
    13:48:19,066 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Using converter: InstanceMethodTypeConverter: public java.lang.String org.apache.camel.converter.jaxp.XmlConverter.toString(javax.xml.transform.Source,org.apache.camel.Exchange) throws javax.xml.transform.TransformerException to convert [class javax.xml.transform.dom.DOMSource=>class java.lang.String]
    13:48:19,067 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 1 - First log: <urn:reverse xmlns:urn="urn:switchyard-quickstart:camel-soap-proxy:1.0">
             <!--Optional:-->
             <text>My message</text>
          </urn:reverse>
    13:48:19,068 INFO  [route1] (http--127.0.0.1-8080-1) Camel 1 - First log: <urn:reverse xmlns:urn="urn:switchyard-quickstart:camel-soap-proxy:1.0">
             <!--Optional:-->
             <text>My message</text>
          </urn:reverse>
    
  • second log message is printed
    13:48:19,083 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 1 - Second log: 
    13:48:19,083 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting javax.xml.transform.dom.DOMSource -> java.lang.String with value: javax.xml.transform.dom.DOMSource@55eb830
    13:48:19,084 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Using converter: InstanceMethodTypeConverter: public java.lang.String org.apache.camel.converter.jaxp.XmlConverter.toString(javax.xml.transform.Source,org.apache.camel.Exchange) throws javax.xml.transform.TransformerException to convert [class javax.xml.transform.dom.DOMSource=>class java.lang.String]
    13:48:19,085 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 1 - Second log: <urn:reverse xmlns:urn="urn:switchyard-quickstart:camel-soap-proxy:1.0">
             <!--Optional:-->
             <text>My message</text>
          </urn:reverse>
    13:48:19,086 INFO  [route1] (http--127.0.0.1-8080-1) Camel 1 - Second log: <urn:reverse xmlns:urn="urn:switchyard-quickstart:camel-soap-proxy:1.0">
             <!--Optional:-->
             <text>My message</text>
          </urn:reverse>
    
  • body is converted to InputStream
    13:48:19,106 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting javax.xml.transform.dom.DOMSource -> java.io.InputStream with value: javax.xml.transform.dom.DOMSource@55eb830
    13:48:19,107 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Using converter: InstanceMethodTypeConverter: public java.io.InputStream org.apache.camel.converter.jaxp.XmlConverter.toInputStream(javax.xml.transform.dom.DOMSource,org.apache.camel.Exchange) throws javax.xml.transform.TransformerException,java.io.IOException to convert [class javax.xml.transform.dom.DOMSource=>class java.io.InputStream]
    13:48:19,108 DEBUG [org.switchyard.internal.ExchangeImpl] (http--127.0.0.1-8080-1) Sending IN Message (1967218379) on IN_OUT Exchange (381066641) for Service '{urn:switchyard-quickstart:camel-soap-proxy:1.0}OutputService', operation 'null'.  Exchange state: OK
    
  • Second component is called, first log message is printed, a body is converted form InputStream to String
    13:48:19,161 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) Processing exchangeId: ID-jpechane-46610-1362401256407-0-5 >>> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,162 TRACE [org.apache.camel.impl.DefaultUnitOfWork] (http--127.0.0.1-8080-1) UnitOfWork created for ExchangeId: ID-jpechane-46610-1362401256407-0-7 with Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,162 TRACE [org.apache.camel.processor.UnitOfWorkProcessor] (http--127.0.0.1-8080-1) Processing exchange asynchronously: Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,163 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) ExchangeId: ID-jpechane-46610-1362401256407-0-7 should continue routing: true
    13:48:19,163 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) Processing exchangeId: ID-jpechane-46610-1362401256407-0-7 >>> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,164 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 2 - First log: 
    13:48:19,164 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.io.ByteArrayInputStream -> java.lang.String with value: java.io.ByteArrayInputStream@5ad8f03a
    13:48:19,164 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Using converter: StaticMethodTypeConverter: public static java.lang.String org.apache.camel.converter.IOConverter.toString(java.io.InputStream,org.apache.camel.Exchange) throws java.io.IOException to convert [class java.io.ByteArrayInputStream=>class java.lang.String]
    13:48:19,165 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 2 - First log: <urn:reverse xmlns:urn="urn:switchyard-quickstart:camel-soap-proxy:1.0">
             <!--Optional:-->
             <text>My message</text>
          </urn:reverse>
    13:48:19,166 INFO  [route2] (http--127.0.0.1-8080-1) Camel 2 - First log: <urn:reverse xmlns:urn="urn:switchyard-quickstart:camel-soap-proxy:1.0">
             <!--Optional:-->
             <text>My message</text>
          </urn:reverse>
    
  • second log message should be printed but body is empty
    13:48:19,167 TRACE [org.apache.camel.management.InstrumentationProcessor] (http--127.0.0.1-8080-1) log: Recording duration: 3 millis for exchange: Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,167 TRACE [org.apache.camel.util.AsyncProcessorHelper] (http--127.0.0.1-8080-1) Exchange processed and is continued routed synchronously for exchangeId: ID-jpechane-46610-1362401256407-0-7 -> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,168 TRACE [org.apache.camel.util.AsyncProcessorHelper] (http--127.0.0.1-8080-1) Exchange processed and is continued routed synchronously for exchangeId: ID-jpechane-46610-1362401256407-0-7 -> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,168 TRACE [org.apache.camel.util.AsyncProcessorHelper] (http--127.0.0.1-8080-1) Exchange processed and is continued routed synchronously for exchangeId: ID-jpechane-46610-1362401256407-0-7 -> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,169 TRACE [org.apache.camel.processor.DefaultErrorHandler] (http--127.0.0.1-8080-1) Is exchangeId: ID-jpechane-46610-1362401256407-0-7 interrupted? false
    13:48:19,169 TRACE [org.apache.camel.processor.DefaultErrorHandler] (http--127.0.0.1-8080-1) Is exchangeId: ID-jpechane-46610-1362401256407-0-7 done? true
    13:48:19,169 TRACE [org.apache.camel.util.AsyncProcessorHelper] (http--127.0.0.1-8080-1) Exchange processed and is continued routed synchronously for exchangeId: ID-jpechane-46610-1362401256407-0-7 -> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,170 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) Processing exchangeId: ID-jpechane-46610-1362401256407-0-7 is continued being processed synchronously
    13:48:19,170 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) ExchangeId: ID-jpechane-46610-1362401256407-0-7 should continue routing: true
    13:48:19,170 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) Processing exchangeId: ID-jpechane-46610-1362401256407-0-7 >>> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,171 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 2 - Second log: 
    13:48:19,172 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.io.ByteArrayInputStream -> java.lang.String with value: java.io.ByteArrayInputStream@5ad8f03a
    13:48:19,172 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Using converter: StaticMethodTypeConverter: public static java.lang.String org.apache.camel.converter.IOConverter.toString(java.io.InputStream,org.apache.camel.Exchange) throws java.io.IOException to convert [class java.io.ByteArrayInputStream=>class java.lang.String]
    13:48:19,173 TRACE [org.apache.camel.impl.converter.DefaultTypeConverter] (http--127.0.0.1-8080-1) Converting java.lang.String -> java.lang.String with value: Camel 2 - Second log: 
    13:48:19,173 INFO  [route2] (http--127.0.0.1-8080-1) Camel 2 - Second log: 
    
  • the debugger has shown that pos is at the end of stream and it is not possible to read a body from the stream
  • message trace shows empty message body
    13:48:19,186 INFO  [org.switchyard.handlers.MessageTrace] (http--127.0.0.1-8080-1) 
    ------- Begin Message Trace -------
    Service -> {urn:switchyard-quickstart:camel-soap-proxy:1.0}ReverseService
    Operation -> reverse
    Phase -> IN
    State -> OK
    Exchange Context -> 
    	CamelCreatedTimestamp : Mon Mar 04 13:48:19 CET 2013
    	CamelToEndpoint : switchyard://ReverseService?namespace=urn%3Aswitchyard-quickstart%3Acamel-soap-proxy%3A1.0
    	org.switchyard.exchange.transaction.beforeInvoked : true
    Message Context -> 
    	org.switchyard.contentType : {urn:switchyard-quickstart:camel-soap-proxy:1.0}reverse
    	org.switchyard.messageId : 3e267a85-21cf-4fee-bc47-38f199976285
    Message Content -> 
    
    ------ End Message Trace -------
    
  • wb service invaction fails - message payload is empty
    13:48:19,231 TRACE [org.apache.camel.processor.Pipeline] (http--127.0.0.1-8080-1) Processing exchangeId: ID-jpechane-46610-1362401256407-0-9 >>> Exchange[Message: [Body is instance of java.io.InputStream]]
    13:48:19,231 DEBUG [org.switchyard.internal.transform.BaseTransformerRegistry] (http--127.0.0.1-8080-1) Selecting fallback transformer: from 'java:java.io.InputStream' to 'java:org.w3c.dom.Node'. Type: org.switchyard.transform.ootb.xml.BasicDOMTransformer
    13:48:19,254 ERROR [stderr] (http--127.0.0.1-8080-1) [Fatal Error] :-1:-1: Premature end of file.
    13:48:19,256 DEBUG [org.switchyard.internal.ExchangeImpl] (http--127.0.0.1-8080-1) Sending OUT Message (173558401) on IN_OUT Exchange (23439915) for Service '{urn:switchyard-quickstart:camel-soap-proxy:1.0}ReverseService', operation 'reverse : IN_OUT : [{urn:switchyard-quickstart:camel-soap-proxy:1.0}reverse, {urn:switchyard-quickstart:camel-soap-proxy:1.0}reverseResponse, null]'.  Exchange state: FAULT
    

Camel component should by default convert to a type that allows repeatable re-use.

It is possible to bypass the issue using

<convertBodyTo type="java.lang.String"/>

but this could be very hard for the user to find out.

Project: SwitchYard
Priority: Major Major
Reporter: Jiri Pechanec
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira