[
https://issues.apache.org/jira/browse/CAMEL-25278?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen reassigned CAMEL-25278:
-----------------------------------
Fix Version/s: 4.23.0
Assignee: shashank
> camel-cometd - a stopped consumer stays subscribed to its channel (each
> message is processed twice after a route restart), and the extensions and
> server listeners are added again for every producer and consumer
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25278
> URL: https://issues.apache.org/jira/browse/CAMEL-25278
> Project: Camel
> Issue Type: Bug
> Components: camel-cometd
> Reporter: shashank
> Assignee: shashank
> Priority: Minor
> Fix For: 4.23.0
>
>
> The producers and consumers of a host and port share one CometD server
> ({{CometdComponent.connect}} / {{disconnect}} with a reference count); the
> server is only stopped with the last of them.
> h3. 1. A stopped consumer keeps listening to its channel
> {{CometdConsumer.doStart}} creates a {{ConsumerService}}
> ({{AbstractService.addService(channel, "push")}}, a listener on the channel)
> and {{doStop}} only calls {{endpoint.disconnect(this)}}: the listener stays
> on the channel. When the server outlives the consumer (a producer, or a
> consumer of another channel, on the same host and port) the old listener
> keeps calling the processor of the route. After a restart of the route there
> are two listeners, and every message is processed twice (three times after
> two restarts, ...).
> h3. 2. Extensions and server listeners are added for every producer and
> consumer
> {{CometdComponent.connect}} adds the configured {{extensions}} and
> {{serverListeners}} to the {{BayeuxServerImpl}} on every call, also when the
> server already exists. {{BayeuxServerImpl}} keeps them in a
> {{CopyOnWriteArrayList}}, so with a producer and a consumer on the same host
> and port each extension and listener is called twice per message or session
> (and once more after each restart). An extension that changes or counts
> messages (or does authentication work) runs several times.
> h3. Reproduction
> {{CometdConsumerRestartTest}} (a producer route and a consumer route on the
> same host and port, in process):
> * stop and start the consumer route, send one message: main delivers it twice
> ({{mock://test Received message count. Expected: <1> but was: <2>}});
> * a {{SessionListener}} registered with {{addServerListener}} is called twice
> for one new session ({{expected: <1> but was: <2>}});
> * control: a stopped consumer route does not receive (passes on main too: the
> stopped route refuses the exchange).
> h3. Proposed fix
> * {{CometdConsumer.doStop}}: remove the service from the channel and
> disconnect its local session.
> * {{CometdComponent.connect}}: set the security policy and add the extensions
> and server listeners only when the server is created.
> With the fix the camel-cometd tests pass (26).
> Affected: 4.14.x, 4.18.x and main (same code).
> Duplicate check (2026-10-02): JIRA component camel-cometd / text "cometd" (87
> issues, mostly camel-salesforce): none about consumer stop or duplicate
> extensions (CAMEL-23507 header filter, CAMEL-12267 transport properties).
> GitHub pull requests "cometd consumer", "cometd extension": none; open #22358
> (getOut cleanup) touches another line of {{CometdConsumer}}.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)