When multiple users send room message, it found "Client is not, or no longer, connected" exception

HI ALL,

My openfire sever version is 3.10.0, and smack version is 4.1.0, and my openfire server machine CPU is 2.6GMZ, and the memory is 8G.

When I use one user to send room message is OK, but when I use multiple users to send room message, it sometimes will found the “Client is not, or no longer, connected” exception.

Is it possible a performance problem? but it just only 2 user. Or I have something wrong?

Please help, the problem trouble me a long time, thanks.

My Java code as follow:

I write a connectPool to keep the user connections, but it not work.

private ConcurrentHashMap<String, XMPPTCPConnection> connectPool = new ConcurrentHashMap<>();

public synchronized XMPPTCPConnection getConnection(String userName) throws Exception {

XMPPTCPConnection connection = connectPool.get(userName);
log.debug(String.format(“connection:%s”, connection));
if (connection != null && connection.isConnected()) {

log.debug(“use old connection”);
return connection;
}

log.debug(“use new connection”);
connection = createConnection(userName, defaultPassword);
connection.connect().login();
log.debug(String.format(“connection is connect:%s”, connection.isConnected()));
connectPool.put(userName, connection);
return connection;
}

private XMPPTCPConnection createConnection(String userName, String password) throws Exception {

XMPPTCPConnectionConfiguration connectionConfig = XMPPTCPConnectionConfiguration.builder()

.setUsernameAndPassword(userName, password)

.setServiceName(serverName)

.setHost(serverHost)

.setSendPresence(false)

.setPort(serverPort)

.setResource(UUID.randomUUID().toString())

.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)

.build();
return new XMPPTCPConnection(connectionConfig);
}

Send room message code as follow, I retry 3 times to send the messages, but it seem not work.

public void sendRoomMessage(String roomName, String userName, String message, int retryCount) throws Exception {

try {

log.debug(String.format(“room name:%s, retry %d times”, roomName, retryCount));
XMPPTCPConnection connection = chatConnectionPool.getConnection(userName);
MultiUserChatManager mucm = MultiUserChatManager.getInstanceFor(connection);

MultiUserChat muc = mucm.getMultiUserChat(ChatUtil.fullRoomName(roomName, serverName));
muc.leave();
muc.createOrJoin(userName);

// sleep to make user join to room first
Thread.sleep(500L);
muc.sendMessage(message);
muc.leave();
} catch (Exception e) {

if (retryCount == SEND_ROOM_MESSAGE_RETRY_TIMES) throw e;
sendRoomMessage(roomName, userName, message, ++retryCount);
}

}

The log as follow:

2015-05-05 17:08:58,542 DEBUG service.ChatService:(ChatService.java:97)

  • room name:room1_key, retry 3 times

2015-05-05 17:08:58,995 DEBUG ChatConnectionPool:(ChatConnectionPool.java:36)

  • connection:org.jivesoftware.smack.tcp.XMPPTCPConnection@274d9652

2015-05-05 17:08:58,995 DEBUG ChatConnectionPool:(ChatConnectionPool.java:38)

  • use old connection

2015-05-05 17:08:59,057 ERROR aspect.ControllerAspect:(ControllerAspect.java:24)

  • sendRoomMessage error: Client is not, or no longer, connected

org.jivesoftware.smack.SmackException$NotConnectedException: Client is not, or no longer, connected

    at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketWriter.throwNotConnectedExce ptionIfDoneAndResumptionNotPossible(XMPPTCPConnection.java:1226)

    at org.jivesoftware.smack.tcp.XMPPTCPConnection.throwNotConnectedExceptionIfApprop riate(XMPPTCPConnection.java:336)

    at org.jivesoftware.smack.AbstractXMPPConnection.sendStanza(AbstractXMPPConnection .java:609)

    at org.jivesoftware.smackx.muc.MultiUserChat.sendMessage(MultiUserChat.java:1577)

    at service.ChatService.sendRoomMessage(ChatService.java:102)

Anyone can help?Thanks.