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

Serializable headers lost by JmsBinding

    XMLWordPrintableJSON

Details

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

    • Unknown

    Description

      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 2.1.5.1 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

      https://issues.apache.org/jira/browse/CAMEL-9584

      Thank you

      Barbara

      Attachments

        Activity

          People

            acosentino Andrea Cosentino
            barbara.devido Barbara De Vido
            Votes:
            2 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: