camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Davide Cavestro (JIRA)" <>
Subject [jira] [Commented] (CAMEL-10666) Serializable headers lost by JmsBinding
Date Tue, 03 Jan 2017 15:33:59 GMT


Davide Cavestro commented on CAMEL-10666:

I've sent a pull request to restore the possibility to send serializable headers within the
exchange when using a JMS endpoint, simply setting to _true_ the new parameter _allowSerializedHeaders_
( honored only when _transferExchange_ is _true_).

Please note that the serialization of _complex_ headers in JMS endpoints was available in
2.15 but removed in 2.16. Now it happens that FUSE 6.3.0 bundles a 2.17, so it would be great
having a way to restore that feature in 2.17. That's why the fix was made on a branch forked
from 2.17.x. 

> Serializable headers lost by JmsBinding
> ---------------------------------------
>                 Key: CAMEL-10666
>                 URL:
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-core, camel-jms
>    Affects Versions: 2.17.0
>         Environment: Apache Camel 2.17.0
>            Reporter: Barbara De Vido
>            Assignee: Andrea Cosentino
>            Priority: Minor
>             Fix For: Future
> 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
>  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
> }
> 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
> Barbara

This message was sent by Atlassian JIRA

View raw message