Hi
There is a ticket related to this
https://issues.apache.org/jira/browse/CAMEL-19675
On Fri, May 5, 2023 at 1:49 PM Kessler, Joerg
wrote:
>
> Hi all,
> We are migrating from Camel 2 to Camel 3. I know that the attachment
> handling has changed here. We were able to adjust most of the code. But now
> I am somehow stuck. We support a format that is a compound message and we
> use the splitter to split such a message in single messages using the
> POJO/Bean approach provided by the splitter. The splitter Bean returns a
> list of Camel messages. The problem I have now is that those messages can
> also have attachments. And now due to the new logic those attachments are
> lost since they are part of the Camel Exchange (and not anymore of the
> message) which is not preserved by the splitter. I think I found the
> corresponding code in org.apache.camel.processor.Splitter:
> public ProcessorExchangePair next() {
> Object part = iterator.next();
> if (part != null) {
> // create a correlated copy as the new exchange to
> be routed in the splitter from the copy
> // and do not share the unit of work
> Exchange newExchange =
> processorExchangeFactory.createCorrelatedCopy(copy, false);
>
> newExchange.adapt(ExtendedExchange.class).setTransacted(original.isTransacted());
> // If the splitter has an aggregation strategy
> // then the StreamCache created by the child
> routes must not be
> // closed by the unit of work of the child route,
> but by the unit of
> // work of the parent route or grand parent route
> or grand grand parent route... (in case of nesting).
> // Therefore, set the unit of work of the parent
> route as stream cache unit of work, if not already set.
> if
> (newExchange.getProperty(ExchangePropertyKey.STREAM_CACHE_UNIT_OF_WORK) ==
> null) {
>
> newExchange.setProperty(ExchangePropertyKey.STREAM_CACHE_UNIT_OF_WORK,
> original.getUnitOfWork());
> }
> // if we share unit of work, we need to prepare
> the child exchange
> if (isShareUnitOfWork()) {
> prepareSharedUnitOfWork(newExchange, copy);
> }
> if (part instanceof Message) {
> newExchange.setIn((Message) part);
> } else {
> Message in = newExchange.getIn();
> in.setBody(part);
> }
> return createProcessorExchangePair(index++,
> processor, newExchange, route);
> } else {
> return null;
> }
> My proposal would be to also add the attachments here to the new Exchange.
> Alternatively newExchange.setIn() could also set the attachments. Any
> other solution proposal is of course also welcome.
>
> Regards,
>
> Jörg
>
--
Claus Ibsen
-
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2