Author: davsclaus Date: Sun Aug 26 09:47:15 2012 New Revision: 1377404 URL: http://svn.apache.org/viewvc?rev=1377404&view=rev Log: CAMEL-5526: Fixed concurrency issue under heavy load in xmpp producer. Thanks to Alexander Titov for the patch.
Modified: camel/branches/camel-2.9.x/ (props changed) camel/branches/camel-2.9.x/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppPrivateChatProducer.java Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ Merged /camel/trunk:r1377402 Merged /camel/branches/camel-2.10.x:r1377403 Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: camel/branches/camel-2.9.x/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppPrivateChatProducer.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppPrivateChatProducer.java?rev=1377404&r1=1377403&r2=1377404&view=diff ============================================================================== --- camel/branches/camel-2.9.x/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppPrivateChatProducer.java (original) +++ camel/branches/camel-2.9.x/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppPrivateChatProducer.java Sun Aug 26 09:47:15 2012 @@ -37,7 +37,7 @@ public class XmppPrivateChatProducer ext private final XmppEndpoint endpoint; private XMPPConnection connection; private final String participant; - + public XmppPrivateChatProducer(XmppEndpoint endpoint, String participant) { super(endpoint); this.endpoint = endpoint; @@ -62,21 +62,7 @@ public class XmppPrivateChatProducer ext } ChatManager chatManager = connection.getChatManager(); - - LOG.trace("Looking for existing chat instance with thread ID {}", endpoint.getChatId()); - Chat chat = chatManager.getThreadChat(endpoint.getChatId()); - if (chat == null) { - LOG.trace("Creating new chat instance with thread ID {}", endpoint.getChatId()); - chat = chatManager.createChat(getParticipant(), endpoint.getChatId(), new MessageListener() { - public void processMessage(Chat chat, Message message) { - // not here to do conversation - if (LOG.isDebugEnabled()) { - LOG.debug("Received and discarding message from {} : {}", getParticipant(), message.getBody()); - } - } - }); - } - + Chat chat = getOrCreateChat(chatManager); Message message = null; try { message = new Message(); @@ -98,6 +84,28 @@ public class XmppPrivateChatProducer ext + " to: " + XmppEndpoint.getConnectionMessage(connection), exchange, e); } } + + private synchronized Chat getOrCreateChat(ChatManager chatManager) { + if (LOG.isTraceEnabled()) { + LOG.trace("Looking for existing chat instance with thread ID {}", endpoint.getChatId()); + } + Chat chat = chatManager.getThreadChat(endpoint.getChatId()); + if (chat == null) { + if (LOG.isTraceEnabled()) { + LOG.trace("Creating new chat instance with thread ID {}", endpoint.getChatId()); + } + chat = chatManager.createChat(getParticipant(), endpoint.getChatId(), new MessageListener() { + public void processMessage(Chat chat, Message message) { + // not here to do conversation + if (LOG.isDebugEnabled()) { + LOG.debug("Received and discarding message from {} : {}" + , getParticipant(), message.getBody()); + } + } + }); + } + return chat; + } @Override protected void doStart() throws Exception {