Hi

Thanks for reporting
https://issues.apache.org/jira/browse/CAMEL-23036

On Fri, Feb 20, 2026 at 5:34 AM Dark Knight <[email protected]>
wrote:

> Hi All,
>
> I’m seeing a NullPointerException in Camel 4.18.0 when using the pooled
> exchange together with a splitter EIP in a Spring Boot application. The
> warning indicates the exception is ignored, but it may point to an
> underlying issue. Please let me know if I have missed anything.
>
> *Log:*
>
> 2026-02-19T22:03:22.518-06:00  WARN 85713 --- [           main]
> o.apache.camel.support.UnitOfWorkHelper  : Exception occurred during done
> UnitOfWork for Exchange: 0AE40C170596909-0000000000000000. This exception
> will be ignored.
>
> *java.lang.NullPointerException: Cannot invoke
> "org.apache.camel.Exchange.getExchangeExtension()" because "this.exchange"
> is null*
>
> at
>
> org.apache.camel.impl.engine.DefaultUnitOfWork.onDone(DefaultUnitOfWork.java:310)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultUnitOfWork.done(DefaultUnitOfWork.java:303)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
> org.apache.camel.support.UnitOfWorkHelper.doneUow(UnitOfWorkHelper.java:53)
> ~[camel-support-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:1177)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:1114)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.AdviceIterator.runAfterTask(AdviceIterator.java:45)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.SharedCamelInternalProcessor$InternalCallback.done(SharedCamelInternalProcessor.java:224)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at org.apache.camel.AsyncCallback.run(AsyncCallback.java:44)
> ~[camel-api-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.doRun(DefaultReactiveExecutor.java:199)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:189)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.tryExecuteReactiveWork(DefaultReactiveExecutor.java:166)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at org.apache.camel.processor.Pipeline.process(Pipeline.java:162)
> ~[camel-core-processor-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.CamelInternalProcessor.processNonTransacted(CamelInternalProcessor.java:385)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:361)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:102)
> ~[camel-direct-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.SharedCamelInternalProcessor.processNonTransacted(SharedCamelInternalProcessor.java:156)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:133)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.SharedCamelInternalProcessor$1.process(SharedCamelInternalProcessor.java:89)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:81)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:86)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:180)
> ~[camel-support-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:175)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:171)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:152)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:186)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> at
>
> org.apache.camel.impl.engine.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:194)
> ~[camel-base-engine-4.18.0.jar:4.18.0]
>
> *Test Code*
>
> package com.example.camel;
>
> import org.apache.camel.*;
>
> import org.apache.camel.builder.RouteBuilder;
>
> import org.apache.camel.component.mock.MockEndpoint;
>
> import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
>
> import org.junit.jupiter.api.Test;
>
> import org.springframework.beans.factory.annotation.Autowired;
>
> import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
>
> import org.springframework.boot.test.context.SpringBootTest;
>
> import org.springframework.context.annotation.Bean;
>
> import org.springframework.context.annotation.Configuration;
>
> import java.util.ArrayList;
>
> import java.util.List;
>
> @CamelSpringBootTest
>
> @EnableAutoConfiguration
>
> @SpringBootTest(
>
>        properties = {"camel.main.exchange-factory=pooled"}
>
> )
>
> public class PooledExchangeSplitterSpringTest {
>
>    @EndpointInject("mock:result")
>
>    MockEndpoint mockEndpoint;
>
>    @Autowired
>
>    ProducerTemplate producerTemplate;
>
>    @Configuration
>
>    static class TestConfig {
>
>        @Bean
>
>        RoutesBuilder route() {
>
>            return new RouteBuilder() {
>
>                @Override
>
>                public void configure() {
>
>                    from("direct:processData")
>
>                            .split(body())
>
>                            .to("mock:result");
>
>                }
>
>            };
>
>        }
>
>    }
>
>    @Test
>
>    public void testSplitter() throws InterruptedException {
>
>        List<Integer> data = new ArrayList<>();
>
>        int total = 3;
>
>        for (int i = 0; i < total; i++) {
>
>            data.add(i);
>
>        }
>
>        mockEndpoint.setExpectedMessageCount(total);
>
>        producerTemplate.sendBody("direct:processData", data);
>
>        mockEndpoint.assertIsSatisfied();
>
>    }
>
> }
>
> Camel Version: 4.18.0
>
> Spring Boot Version: 3.5.10
>
> Java Version: 17
>
>
> I expect no NPE when UnitOfWork completes.
>
>
> Thanks,
>
> DK
>


-- 
Claus Ibsen

Reply via email to