[
https://issues.apache.org/jira/browse/CAMEL-25742?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-25742.
---------------------------------
Resolution: Fixed
> camel-coap - an observe=true consumer never cancels its observation, so after
> a route stop and start every notification is routed twice
> ---------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25742
> URL: https://issues.apache.org/jira/browse/CAMEL-25742
> Project: Camel
> Issue Type: Bug
> Components: camel-coap
> Reporter: shashank
> Assignee: shashank
> Priority: Major
> Fix For: 4.24.0
>
>
> A route {{from("coap://host:5683/sensor?observe=true")}} uses
> {{CoAPObserver}}. On start it calls {{client.observe(this)}} (RFC 7641) and
> drops the returned {{CoapObserveRelation}}. The class has no {{doStop}} (main
> 826a664c5f16), so stopping the consumer does nothing to the observation:
> * the server keeps the stopped consumer as an observer, and each notification
> is still delivered to it; while the route is stopped each one fails with
> {{RouteStoppingException}} and is logged as a WARN by the consumer;
> * when the route is started again, Camel creates a new consumer, which
> observes the resource a second time. The stopped consumer still holds the
> route's processor, which is started again, so from then on each notification
> is routed twice, and once more for each further stop / start;
> * {{onError}} observes again even after a stop;
> * the {{CoapClient}} of a stopped consumer is never shut down.
> Trigger: default options, a route with an {{observe=true}} consumer that is
> stopped and started again ({{camel cmd stop-route}} / {{start-route}}, JMX /
> management, the route controller API). A route reload removes the route
> instead; the old consumer's observation is then also left (a WARN per
> notification, and a client that is not shut down per reload), but it does not
> route into the new route (read, not tested).
> h3. Reproduction
> New test {{CoAPObserveRestartTest}} (2 tests, Camel CoAP server with an
> observable resource in the same JVM, no external service):
> * stop and start the observer route, then change the resource once: the
> notification must be routed once. On main it is routed twice:
> {{mock://observed Received message count. Expected: <1> but was: <2>}} (3 of
> 3 runs);
> * after {{stopRoute("observer")}} the resource must have no observer left,
> after {{startRoute}} exactly one. On main the server still holds the stopped
> consumer's observation ({{ConditionTimeout ... was not fulfilled within 10
> seconds}} at the {{observerCount() == 0}} wait, 3 of 3 runs).
> h3. Proposed fix
> Keep the relation returned by {{observe}}, and in {{doStop}} cancel it with
> {{proactiveCancel()}} (Californium cancels the observation in the client at
> once, so a later notification is not delivered, and sends the deregistration
> to the server), then shut the client down; {{onError}} observes again only
> while the consumer is running. With the fix the camel-coap tests pass: 78
> run, 0 failures, 0 errors, 0 skipped.
> Not changed: the server side {{CoAPConsumer}} also has no {{doStop}} (a
> stopped route keeps answering requests until its path is taken by a new
> consumer); its client {{CoapEndpoint}} (socket and threads) is also not
> destroyed by {{CoapClient.shutdown()}}. Both are left for a follow-up.
> Affected: main (tested); camel-4.23.x, camel-4.22.x, camel-4.18.x and
> camel-4.14.x have the same {{CoAPObserver}} without {{doStop}} (read, not
> run). The observe consumer exists since CAMEL-19280.
> Duplicate check (2026-10-17): JIRA text "CoAPObserver", "coap observe stop",
> "coap observe cancel": nothing related. GitHub pull requests "coap observe":
> none about the observer lifecycle.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)