[ 
https://issues.apache.org/jira/browse/CAMEL-24099?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Federico Mariani updated CAMEL-24099:
-------------------------------------
    Attachment: BeanLifecycleRouteRestartTest.java

> camel-bean: bean implementing Service is not restarted on route restart when 
> used via bean() DSL
> ------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24099
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24099
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-bean
>    Affects Versions: 4.21.0
>            Reporter: Federico Mariani
>            Priority: Major
>         Attachments: BeanLifecycleRouteRestartTest.java
>
>
> A bean that implements {{org.apache.camel.Service}} and is used in a route 
> via the {{.bean(instance)}} DSL has its {{stop()}} method invoked when the 
> route is stopped, but {{start()}} is *never invoked again* when the route is 
> restarted. The bean then runs in "stopped" state (closed connections, 
> released resources) while the route is up.
> *Cause*
> {{BeanProcessor}} delegates lifecycle asymmetrically:
> {code:java}
> protected void doStart() throws Exception { delegate.start(); }   // 
> state-machine method
> protected void doStop() throws Exception { delegate.doStop(); }   // raw 
> method - bypasses BaseService state
> {code}
> Because {{delegate.doStop()}} bypasses {{BaseService.stop()}}, the delegate's 
> status remains {{STARTED}} after the route stops. On route restart 
> {{delegate.start()}} early-returns ({{BaseService.start()}} returns 
> immediately when {{status == STARTED}}), so 
> {{AbstractBeanProcessor.doStart()}} never re-invokes 
> {{ServiceHelper.startService(bean)}}.
> The asymmetry was introduced by CAMEL-11375 (commit b3ca9219fb8c, "Optimise - 
> BeanProcessor - Make light-weight not as service").
> *Scope*
> Only the {{.bean()}} / {{<bean>}} DSL is affected ({{BeanReifier}} uses 
> {{BeanProcessor}} directly). {{to("bean:...")}} endpoints are masked because 
> {{BeanProducer.doStart/doStop}} independently start/stop the bean.
> *Suggested fix*
> Call {{delegate.stop()}} in {{doStop()}}. Note {{doShutdown()}} calls 
> {{delegate.shutdown()}} which internally calls {{stop()}} first — today that 
> causes a second raw {{doStop()}} on a delegate whose status is still 
> {{STARTED}}, so aligning {{doStop()}} also fixes that double-stop.
> *Reproducer*
> Attached test {{BeanLifecycleRouteRestartTest}} fails on main 
> (4.22.0-SNAPSHOT) with:
> {noformat}
> org.opentest4j.AssertionFailedError: expected: <started> but was: <stopped>
> {noformat}
> _This issue was found by an AI-assisted code review. Reported by Claude Code 
> on behalf of [~fmariani] (GitHub: Croway)._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to