Smack 3.1.0 creates a new chat for every incoming message


Smack 3.1.0 creates a new chat for every incoming message

Forum Post Quote:
I've found a bug which took a few hours to figure out:

If the remote client doesn't supply a thread-id (psi doesn't), then Smack will create a new Chat for every thread. It can't ever reuse chats from ChatManager.jidChats because of an impedance mismatch.

The problem is, it puts raw jabber addresses as keys (, but gets jabber addresses cleaned by StringUtils.parseBareAddress (

FIX is described here:




Robin Collier
February 21, 2011, 7:01 PM

Added tracking of chats by base jid (only full jid currently). Now when a chat message with no thread id is received, a match is attempted by both full and base jid, thus insuring a match if a chat to that user has already been created. Also made the lookups threadsafe.

On a different note though, I noticed that it also attempts to do this same match when there is a thread ID as well but no existing chat exists for that ID. I would think that should always result in a new chat, not matching a chat with a different id but the same JID, which is what it does now.

Guus der Kinderen
February 24, 2010, 8:48 PM
Guus der Kinderen
January 12, 2010, 5:33 AM

The unpatched source matches the bare JIDs against a map that is most likely to hold full JIDs. I've applied the patch as provided in the community discussion.

Konrad Mrożek
August 6, 2009, 1:40 PM

Hi, I think the patch which was given is sufficient. It corrects the bug. Why isn't it commited to trunk?

ThreadID is a problem for e.g. Psi or iChat. These programs don't attach threadid to message "chat" packet at all. So someone (as I have seen in SVN called gato) added workaround to this bug of clients. But he probably didn't think about resources attached address or didn't change line 177 to

String userJID = StringUtils.parseBareAddress(message.getFrom());

I think, that patch from ilja makes assigning chats without threadid more accurate.

So I don't know why it's not commited yet.

Ankit Nitin
July 14, 2009, 6:24 PM

Major problem
ThreadID is everywhere documented as the unique identifier for chat messages. If a packet do not contain a threadID then how smack figure out the chat object to which the packet needs to be delivered ?

Your pinned fields
Click on the next to a field label to start pinning.


Robin Collier


Walter Ebeling