Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-10666

Serializable headers lost by JmsBinding



    • Improvement
    • Status: Resolved
    • Minor
    • Resolution: Fixed
    • 2.17.0
    • 2.19.0
    • camel-core, camel-jms
    • None
    • Apache Camel 2.17.0

    • Unknown


      In Camle 2.15.1 I was able to set a custom object in the header of my exchange and as long as it was serializable and the container consuming the route had this JVM options set (-Dorg.apache.activemq.SERIALIZABLE_PACKAGES="*") and the queue had for both producer and consumer the option "transferExchange=true" everything was working fine.

      Now my company wanted to move to Camel 2.17.0.
      The same code do not work anymore. All serializable objects in header are removed.

      To make a simple example, there is not need to have a custom object, it can be a Calendar object.

      I decided to debug the code, and I noticed a big change in the org.apache.camel.impl.DefaultExchangeHolder class (camel-core).

      It is used by the org.apache.camel.component.jms.JmsBinding#createJmsMessage(org.apache.camel.Exchange, java.lang.Object, java.util.Map<java.lang.String,java.lang.Object>, Session, org.apache.camel.CamelContext). Which is in camel-jms

      JmsBinding methos invoke DefaultExchangeHolder.marshal(echange)

      which is this:

      public static DefaultExchangeHolder marshal(Exchange exchange)

      { return marshal(exchange, true, false); <---- THE FALSE PARAMETER AVOID THE MARSHAL OF COMPLEX TYPE }

      In Camel the class is quite different and there is not any flag avoiding the serializable headers, or at list I did not see any.

      This is a big change and it is not documented since if I look at the Camel page, it clearly states that if transferExchange is true than

      "You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level.

      You must enable this option on both the producer and the consumer side, so Camel will know that the payload is an Exchange and not a regular payload."

      There is any workaround in order to make this whole thing work as is should work?

      I know that there was a similar issue for levelDb


      Thank you





            acosentino Andrea Cosentino
            barbara.devido Barbara De Vido
            2 Vote for this issue
            5 Start watching this issue