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

Work on CAMEL-25842 started by shashank.
----------------------------------------
> camel-xmpp - after a lost connection the consumer connects again without 
> logging in, and consumes nothing again (private chats and rooms) until the 
> route restarts
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25842
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25842
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-xmpp
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>
> {{XmppConsumer}} watches its connection with a scheduled task 
> ({{startRobustConnectionMonitor}}, every {{connectionPollDelay}} seconds, 
> main 20cdb309f7d0). When the connection was lost (a network failure, a server 
> restart, the server closing an idle stream) {{checkConnection}} calls 
> {{connection.connect()}} and nothing else:
> {code:java}
> if (!connection.isConnected()) {
>     LOG.info("Attempting to reconnect to: {}", ...);
>     connection.connect();
> }
> {code}
> With Smack 4.4 (Camel uses 4.4.8 since 4.22, CAMEL-23562) 
> {{AbstractXMPPConnection.connect()}} only opens the stream; it does not log 
> in (Smack's own {{ReconnectionManager}}, which would, is off by default and 
> Camel does not enable it). An XMPP server delivers no stanza to a stream that 
> has not logged in and bound a resource (RFC 6120), and it removes an occupant 
> from a multi-user chat room when its connection ends. So after the first lost 
> connection:
> * the consumer reports a working connection ({{isConnected()}} is true, so 
> the monitor does not try again), logs nothing more, and receives no private 
> chat message and no room message again, until the route is restarted;
> * for a room consumer, the room no longer has the consumer as an occupant 
> either.
> {{XmppRobustConnectionTest}} has been {{@Disabled}} with the note that the 
> reconnect does not seem to work since Smack 4.2; this is a likely cause.
> *Fix*: when the connection is not authenticated, the monitor logs it in again 
> ({{XmppEndpoint.login}}, split out of {{createConnection}}, as the configured 
> user or anonymously; {{createAccount}} still only applies to the first 
> connection) and the consumer enters its room again with the same nickname and 
> room password. The producers' reconnect ({{XmppGroupChatProducer}}, 
> {{XmppDirectProducer}}) is not changed here; a send on a connection that was 
> not logged in again fails loudly there.
> *Tests*: new {{XmppConsumerReconnectTest}} (2 tests) with a small in-process 
> XMPP server ({{FakeXmppServer}}, plain TCP, SASL ANONYMOUS, resource binding, 
> multi-user chat presence) that, like a real server, delivers stanzas only to 
> sessions that logged in and to room occupants of the current session; the 
> real Smack 4.4.8 client connects to it. Both tests receive a message, drop 
> every connection on the server, and wait for the consumer to come back. On 
> main both fail: {{The consumers did not log in again ==> expected: <2> but 
> was: <0> within 20 seconds}} and {{The consumer did not enter the room again 
> ==> expected: <1> but was: <0>}} (the log shows "Attempting to reconnect" 
> once per consumer, then nothing). With the fix both pass. camel-xmpp unit 
> tests with the fix: 11 run, 0 failures, 5 skipped (Google Talk and the 
> disabled robust connection test); the container integration tests were not 
> run.
> *How it was found*: variant analysis of CAMEL-25815 (pattern: server-side 
> state of a consumer, here the authenticated session and the room occupancy, 
> lost on a reconnect and not created again), then the JUnit test.
> *Affected*: main, camel-4.23.x and camel-4.22.x (Smack 4.4.8; read, not run). 
> camel-4.18.x and 4.14.x have the same {{checkConnection}} with Smack 4.3.5, 
> whose {{connect()}} I did not check.
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to