AnsweredAssumed Answered

Smack behavior for multithreaded environment

Question asked by Raveesh on Nov 12, 2014
Latest reply on Nov 12, 2014 by Raveesh

Hi,

I have recently started using Smack 4.0.5 version as a client for my openfire server.  I have just completed a basic implementation of (1) createAccount API using Smack (2)adding users to a particular roster and all my unit test cases passed. I then exposed this createAccount API as a restful interface.But just to check the performance . I ran a JMeter load test by spawning 1000 concurrent requests to create users in openfire. This is where the problem begins. , Although a lot of requests seems to be going through I started observing the following exceptions

 

1)

org.jivesoftware.smack.SmackException$NoResponseException

        at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:1 91)

        at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:1 75)

        at org.jivesoftware.smack.Roster.createEntry(Roster.java:316)

        at com.hp.userservice.dao.impl.ProvisioningDAO.addUserToMerchantRoster(Provisionin gDAO.java:356)

        at com.hp.userservice.dao.impl.UserServiceAdministrationImpl.createUser(UserServic eAdministrationImpl.java:90)

 

2)

Connection closed with error

stream:error (conflict)

        at org.jivesoftware.smack.tcp.PacketReader.parsePackets(PacketReader.java:226)

        at org.jivesoftware.smack.tcp.PacketReader.access$000(PacketReader.java:47)

        at org.jivesoftware.smack.tcp.PacketReader$1.run(PacketReader.java:81)

 

3)

2014-11-12 13:25:36 INFO  com.hp.userservice.dao.impl.ProvisioningDAO:157 - User created successfully in OF_USER table in openfire

Exception writing closing stream element

java.net.SocketException: Software caused connection abort: socket write error

        at java.net.SocketOutputStream.socketWrite0(Native Method)

        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)

        at java.net.SocketOutputStream.write(SocketOutputStream.java:159)

        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)

        at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)

        at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)

        at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)

        at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)

        at java.io.BufferedWriter.flush(BufferedWriter.java:254)

        at org.jivesoftware.smack.tcp.PacketWriter.writePackets(PacketWriter.java:190)

        at org.jivesoftware.smack.tcp.PacketWriter.access$000(PacketWriter.java:40)

        at org.jivesoftware.smack.tcp.PacketWriter$1.run(PacketWriter.java:77)

 

 

These errors seems to be occurring even for 50 concurrent users.

 

This is my Code :

 

//Obtaining XMPPCOnnection

public XMPPConnection connectToOF() throws ConnectionFailedException{

        configuration = new ConnectionConfiguration(OFHost, OFPort);

        configuration.setSecurityMode(SecurityMode.disabled);

        configuration.setReconnectionAllowed(true);

        configuration.setSecurityMode(SecurityMode.disabled);

        configuration.setRosterLoadedAtLogin(false);

        configuration.setSendPresence(false);

 

        connection = new XMPPTCPConnection(configuration);

        try {

            connection.connect();

           

            return connection;

           

        } catch (XMPPException | SmackException | IOException e) {

            log.error("Error while obtaining the connection to Openfire.");

            log.error(e.getMessage());

            throw new ConnectionFailedException(ErrorCodes.OPENFIRE_SERVER_UNREACHABLE);

        }

 

//Creating Account

 

AccountManager manager = connectionObj.getAccountManager();

        Map<String, String> registrationMap = new HashMap<String, String>();

        registrationMap.put("name", userObj.getAlias());

        registrationMap.put("email", userObj.getEmailId());

        try {

            manager.createAccount(userName, password, registrationMap); //ofuser create account

}catch(Exception e){

 

}

 

//Roster Snippet

Roster roster = xmppconnection.getRoster();

        String groupName = null;

        if(userObj.getGroup() == null )

            groupName = userObj.getAppid();

        else

            groupName = userObj.getGroup();

        RosterGroup rgroup = roster.createGroup(groupName);

        if(rgroup !=null)return true;

        else

            return false;

        }

 

 

I need to know under what circumstances are the exceptions raised. Are there any performance benchmarks already available, Is there any particular configuration I need to do in my code to ensure such errors dont arise ?

Outcomes