You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Andrea Cosentino (Jira)" <ji...@apache.org> on 2026/09/17 07:30:00 UTC

[jira] [Work started] (CAMEL-24789) camel-vertx-websocket: the producer completes an exchange both synchronously and asynchronously when there is no peer

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

Work on CAMEL-24789 started by Andrea Cosentino.
------------------------------------------------
> camel-vertx-websocket: the producer completes an exchange both synchronously and asynchronously when there is no peer
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24789
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24789
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-vertx-websocket
>            Reporter: Andrea Cosentino
>            Assignee: Andrea Cosentino
>            Priority: Minor
>
> h3. Summary
> {{VertxWebsocketProducer.process}} tells its callback the exchange finished synchronously and simultaneously tells the caller it will finish asynchronously, whenever there is no peer to send to.
> h3. Detail
> {{VertxWebsocketProducer}} lines 66-99:
> {code:java}
> if (connectedPeers.isEmpty()) {
>     callback.done(true);
> }
> // Send message to each peer then record and process the results asynchronously
> connectedPeers.forEach((connectionKey, webSocket) -> { ... });
> return false;
> {code}
> With no connected peers the {{forEach}} does nothing, so the method has already completed the callback with {{doneSync=true}} and then returns {{false}}. {{AsyncProcessor#process}} documents the return value as {{doneSync}} - "true to continue execution synchronously, false to continue being executed asynchronously" - so the two signals contradict each other. The null-body branch eight lines earlier in the same method gets this right:
> {code:java}
> if (message == null) {
>     // Nothing to do for a null body
>     callback.done(true);
>     return true;
> }
> {code}
> The path is easy to reach: {{sendToAll}} with nothing connected yet, or a {{CamelVertxWebsocket.connectionKey}} that matches no current peer.
> h3. Related silence on the same path
> Line 123-125 filters the requested connection keys against the known peers:
> {code:java}
> Stream.of(connectionKey.split(","))
>         .filter(peers::containsKey)
>         .forEach(key -> connectedPeers.put(key, endpoint.findPeerForConnectionKey(key)));
> {code}
> A key that matches nothing is dropped without a word, and the exchange completes as if it had been delivered. One line further on, a peer whose websocket turns out to be null does produce a warning, so the quiet case is the inconsistent one.
> Found by a source audit of {{components/camel-vertx}} at be3dd651866f.



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