Hi

Indeed the code looks like a bug as the exchange clock is needed to be
resetable when pooled
https://issues.apache.org/jira/browse/CAMEL-22973


On Sun, Feb 8, 2026 at 11:18 AM Claus Ibsen <[email protected]> wrote:

> Hi
>
> We have not heard about this before. The stacktrace error seems a bit
> weird.
> Are you sure you are using all the same versions of Camel JARs?
>
>
>
> On Sun, Feb 8, 2026 at 12:59 AM Dark Knight <[email protected]>
> wrote:
>
>> Hi All,
>>
>>
>> I’m seeing a java.lang.ClassCastException in
>> PooledProcessorExchangeFactory when
>> using the Splitter with exchange pooling enabled in Camel 4.17.0.
>>
>> The same code works in Camel 4.3.0, so I suspect this might be a
>> regression.
>>
>>
>> Callstack:
>>
>> Caused by: java.lang.ClassCastException: class
>> org.apache.camel.support.MonotonicClock cannot be cast to class
>> org.apache.camel.support.ResetableClock
>> (org.apache.camel.support.MonotonicClock and
>> org.apache.camel.support.ResetableClock are in unnamed module of loader
>> 'app')
>>
>> at
>>
>> org.apache.camel.impl.engine.PooledProcessorExchangeFactory.createCopy(PooledProcessorExchangeFactory.java:76)
>>
>> at
>>
>> org.apache.camel.processor.Splitter.copyAndPrepareSubExchange(Splitter.java:314)
>>
>> at
>>
>> org.apache.camel.processor.Splitter$SplitterIterable.<init>(Splitter.java:178)
>>
>> at
>>
>> org.apache.camel.processor.Splitter.createProcessorExchangePairsIterable(Splitter.java:152)
>>
>> at
>>
>> org.apache.camel.processor.Splitter.createProcessorExchangePairs(Splitter.java:140)
>>
>> at
>>
>> org.apache.camel.processor.MulticastProcessor.doProcess(MulticastProcessor.java:336)
>>
>> at
>>
>> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:328)
>>
>> at org.apache.camel.processor.Splitter.process(Splitter.java:126)
>>
>>
>> Test Code:
>>
>> public class SplitterPolledExchangeTest extends CamelTestSupport {
>>
>>
>>    @Override
>>
>>    protected RoutesBuilder createRouteBuilder() {
>>
>>        return new RouteBuilder() {
>>
>>            @Override
>>
>>            public void configure() {
>>
>>                from("direct:processData")
>>
>>                        .split(body()).streaming().parallelProcessing()
>>
>>                        .to("mock:result");
>>
>>            }
>>
>>        };
>>
>>    }
>>
>>
>>   @Override
>>
>>    protected CamelContext createCamelContext() throws Exception {
>>
>>        CamelContext camelContext = super.createCamelContext();
>>
>>        ExtendedCamelContext ecc = camelContext.getCamelContextExtension();
>>
>>
>>        ecc.setExchangeFactory(new PooledExchangeFactory());
>>
>>        ecc.setProcessorExchangeFactory(new
>> PooledProcessorExchangeFactory());
>>
>>        ecc.getExchangeFactory().setStatisticsEnabled(true);
>>
>>        ecc.getProcessorExchangeFactory().setStatisticsEnabled(true);
>>
>>
>>        return camelContext;
>>
>>    }
>>
>>
>>    @Test
>>
>>    public void testSplitter() throws Exception {
>>
>>        List<Integer> data = new ArrayList<>(Arrays.asList(1, 2, 3));
>>
>>
>>        getMockEndpoint("mock:result").expectedMessageCount(3);
>>
>>        template.sendBody("direct:processData", data);
>>
>>
>>        MockEndpoint.assertIsSatisfied(context);
>>
>>    }
>>
>> }
>>
>> Camel Version: 4.17.0
>>
>> Java Version: 17
>>
>>
>> Is this expected behavior, or is this a bug in Camel 4.17.0?
>> Are there recommended workarounds for using the Splitter with exchange
>> pooling enabled?
>>
>>
>> Thanks,
>>
>> DK
>>
>
>
> --
> Claus Ibsen
>


-- 
Claus Ibsen

Reply via email to