[jboss-user] [Remoting] - Sockets left in CLOSE_WAIT on server

engluer do-not-reply at jboss.com
Thu Oct 4 14:08:26 EDT 2007


I was trying to cleaning close a connection to a JBoss server.  I have tried the following on both JBoss 4.2.2 with Messaging and JBoss 5 b2 and in both cases when the client closes the connection a socket is left in the CLOSE_WAIT state on the server.  In both cases I was using the BiSocket transport



  | import javax.jms.Connection;
  | import javax.jms.ConnectionFactory;
  | import javax.jms.Destination;
  | import javax.jms.JMSException;
  | import javax.jms.Message;
  | import javax.jms.MessageConsumer;
  | import javax.jms.MessageListener;
  | import javax.jms.Session;
  | import javax.naming.InitialContext;
  | import javax.naming.NamingException;
  | 
  | /*
  |  * 
  |  * Note monitor server connections with
  |  * watch "/usr/sbin/lsof -p [pid of Jboss server] | grep -c CLOSE_WAIT"
  |  * 
  |  */
  | 
  | public class SimpleSubscriber implements MessageListener {
  | 
  |     private Session subSession;
  |     private Connection connection;
  |     private String destName;
  |     
  |     private String password;
  |     private String username;
  |     private ConnectionFactory conFactory;
  |     private InitialContext ic;
  |     private MessageConsumer subscriber;
  |     
  |     public SimpleSubscriber(String destName, String username, String password) {
  |         this.destName = destName;
  |         this.username = username;
  |         this.password = password;
  |     }
  |     
  |     private void connect() throws NamingException, JMSException {
  |         if (ic == null) {
  |             ic = new InitialContext();
  |         }
  |         
  |         //Look up JMS connection Factory
  |         conFactory = (ConnectionFactory)ic.lookup("/ConnectionFactory");
  |         
  |         //Lookup Destination
  |         Object obj = ic.lookup(destName);
  |         Destination topic = (Destination)obj;
  |         
  |         //Create JMS connection
  |         connection = conFactory.createConnection(username, password);
  |         
  |         //Create two JMS session objects
  |         subSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  |         subscriber = subSession.createConsumer(topic);
  |         subscriber.setMessageListener(this);
  |         
  |         //Start the connection
  |         connection.start();
  |     }
  |     
  |     public void close() throws JMSException {
  |         subscriber.close();
  |         subSession.close();
  |         connection.close();
  |     }
  |     
  |     public static void main(String [] args) {
  |         String username = null;
  |         String password = null;
  |         String dest= null;
  |         
  |         if (args.length != 3) {
  |             printUsage();
  |             return;
  |         }
  |         
  |         dest= args[0];
  |         
  |         username = args[1];
  |         password = args[2];
  |         
  |         final SimpleSubscriber subscriber = new SimpleSubscriber(dest, username, password);
  |         
  |         System.out.println("Connecting to JBoss...");
  |         try {
  |             subscriber.connect();
  |         } catch (NamingException e) {
  |             e.printStackTrace();
  |             return;
  |         } catch (JMSException e) {
  |             e.printStackTrace();
  |             return;
  |         }
  |         
  |         System.out.println("Connected");
  |         
  |         System.out.println("Sleeping");
  |         
  |         try {
  |             Thread.sleep(5000);
  |         } catch (InterruptedException e) {}
  |         System.out.println("Disconnecting");
  |         
  |         try {
  |             subscriber.close();
  |         } catch (JMSException e) {
  |             e.printStackTrace();
  |         }
  |         
  |         System.out.println("Closed");
  |         
  |         try {
  |             Thread.sleep(5000);
  |         } catch (InterruptedException e) {}
  |         
  |         System.out.println("Done");
  |     }
  |     
  |     private static void printUsage() {
  |         System.out.println("Subscriber <topic> [username] [password]"
  |                 + "\ntopic: Name of topic to connect to pings with"
  |                 + "\nusername: Username to connect with"
  |                 + "\npassword: Password to connect with");
  |     }
  |     
  |     public void onMessage(Message arg0) {
  |         System.out.println("Received Message: " + arg0);
  |     }
  | 
  | }
  | 



Th above example connects waits, then disconnects and waits, then shuts down.  Am I not closing the connection correctly?  I am using the following to check for socket state.

  | watch "/usr/sbin/lsof -p [pid of Jboss server] | grep -c CLOSE_WAIT"
  | 

The server we are using has client connecting and disconnecting quite rapidly and we quickly run out of file descriptors because of all the CLOSE_WAIT sockets left open.

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4091683#4091683

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4091683



More information about the jboss-user mailing list