[
https://issues.apache.org/jira/browse/CAMEL-20889?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Luigi De Masi updated CAMEL-20889:
----------------------------------
Summary: camel-core: Stream is not reset when Message.getBody(class) is
invoked ans stream caching is enabled (was: Stream is not reset when
Message.getBody(class) is invoked ans stream caching is enabled)
> camel-core: Stream is not reset when Message.getBody(class) is invoked ans
> stream caching is enabled
> ----------------------------------------------------------------------------------------------------
>
> Key: CAMEL-20889
> URL: https://issues.apache.org/jira/browse/CAMEL-20889
> Project: Camel
> Issue Type: Bug
> Components: came-core
> Reporter: Luigi De Masi
> Assignee: Luigi De Masi
> Priority: Major
>
> Having the following Camel route on Camel 2.x
> {code:java}
> from("timer:mytimer2?repeatCount=1&delay=1000")
> .routeId("generate-route-marshall")
> .streamCaching()
> .transform(constant("\{\"maskme\":\"json payload\"}"))
> .marshal().json(JsonLibrary.Jackson)
> .process(exchange ->
> {
> LOGGER.info("body class name -> " +
> exchange.getIn().getBody().getClass().getName());
> LOGGER.info("consumed once using .getBody(String.class) -> " +
> exchange.getIn().getBody(String.class));
> LOGGER.info("consumed twice using .getBody(String.class) -> " +
> exchange.getIn().getBody(String.class));
> })
> .to("jms:queue:INCOMING");
> {code}
>
> Shows that the consumption of the message payload in the processor via
> {code:java}
> exchange.getIn().getBody(String.class));\{code}
> works as expected, as the body is shown twice on the logs, as follows.
> {code:java}
> body class name -> org.apache.camel.converter.stream.InputStreamCache
> consumed once using .getBody(String.class) -> "\{\"maskme\":\"json
> payload\"}"
> consumed twice using .getBody(String.class) -> "\{\"maskme\":\"json
> payload\"}"
> {code}
>
> But if you run this same route from Camel 3.x to the latest 4.x one, you
> will get the following output:
> {code:java}
> body class name -> org.apache.camel.converter.stream.InputStreamCache
> consumed once using .getBody(String.class) -> "\{\"maskme\":\"json
> payload\"}"
> consumed once using .getBody(String.class) ->
> {code}
>
> The problem is that on Camel 2.x, when
> {{ exchange.getIn().getBody(String.class))}}
> is called, the
> [org.apache.camel.converter.IOConverterOptimised|https://github.com/apache/camel/blob/camel-2.x/camel-core/src/main/java/org/apache/camel/converter/IOConverterOptimised.java]
> is triggered to convert the body from
> {{org.apache.camel.converter.stream.InputStreamCache}} to
> {{{}java.lang.String{}}}, which at the beginning of the convertion, [it reset
> the
> stream|https://github.com/apache/camel/blob/a05826ece32fbb8e2ba6df0e0ac2a3d5903f9572/camel-core/src/main/java/org/apache/camel/converter/IOConverterOptimised.java#L50]:
>
> {code:java|title=IOConverterOptimised.java}
> public final class IOConverterOptimised {
> private IOConverterOptimised() {
> }
> public static Object convertTo(final Class<?> type, final Exchange
> exchange, final Object value) throws Exception {
> Class fromType = value.getClass();
> if (value instanceof StreamCache) {
> ((StreamCache)value).reset(); // <------ HERE
> }
> {code}
> From Camel 3.x,
> [org.apache.camel.converter.IOConverterOptimised|https://github.com/apache/camel/blob/camel-2.x/camel-core/src/main/java/org/apache/camel/converter/IOConverterOptimised.java]
> has been dropped, and
> [org.apache.camel.converter.IOConverter|https://github.com/apache/camel/blob/4c41ebcb73af761dcebf6e4ebb9a68e768e505a1/core/camel-base/src/main/java/org/apache/camel/converter/IOConverter.java]
> is used instead, which doesn't reset the stream.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)