[jboss-svn-commits] JBL Code SVN: r20417 - labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jun 11 07:39:46 EDT 2008


Author: kevin.conner at jboss.com
Date: 2008-06-11 07:39:46 -0400 (Wed, 11 Jun 2008)
New Revision: 20417

Modified:
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPool.java
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsSession.java
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsXASession.java
Log:
Fix pool reuse on error: JBESB-1748

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPool.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPool.java	2008-06-11 09:20:40 UTC (rev 20416)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPool.java	2008-06-11 11:39:46 UTC (rev 20417)
@@ -24,6 +24,7 @@
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
@@ -104,6 +105,11 @@
     private boolean terminated ;
     
     /**
+     * The pool instance id.
+     */
+    private long id ;
+    
+    /**
      * Contructor of the pool.
      * 
      */
@@ -143,9 +149,9 @@
         // For now we only support JTA transacted sessions
         final JmsSession session ;
         if (transacted) {
-            session = new JmsXASession(this, ((XAConnection)jmsConnection).createXASession());
+            session = new JmsXASession(this,  ((XAConnection)jmsConnection).createXASession(), id);
         } else {
-            session = new JmsSession(jmsConnection.createSession(transacted, acknowledgeMode));
+            session = new JmsSession(jmsConnection.createSession(transacted, acknowledgeMode), id);
         }
         freeSessions.add(session);
         logger.debug("Number of Sessions in the pool with acknowledgeMode: " + acknowledgeMode + " is now " + getSessionsInPool(acknowledgeMode));
@@ -258,19 +264,22 @@
      */
     synchronized void handleCloseSession(final JmsSession session)
     {
-        final int mode ;
-        try {
-            mode = session.getAcknowledgeMode() ;
-        } catch (final JMSException jmse) {
-            logger.warn("JMSException while calling getAcknowledgeMode") ;
-            logger.debug("JMSException while calling getAcknowledgeMode", jmse) ;
-            return ;
+        if (session.getId() == id)
+        {
+            final int mode ;
+            try {
+                mode = session.getAcknowledgeMode() ;
+            } catch (final JMSException jmse) {
+                logger.warn("JMSException while calling getAcknowledgeMode") ;
+                logger.debug("JMSException while calling getAcknowledgeMode", jmse) ;
+                return ;
+            }
+            
+            final ArrayList<JmsSession> sessions = (freeSessionsMap == null ? null : freeSessionsMap.get(mode));
+            if (sessions != null) {
+                sessions.add(session) ;
+            }
         }
-        
-        final ArrayList<JmsSession> sessions = (freeSessionsMap == null ? null : freeSessionsMap.get(mode));
-        if (sessions != null) {
-            sessions.add(session) ;
-        }
         handleReleaseSession(session) ;
     }
     
@@ -321,6 +330,42 @@
     }
 
     /**
+     * This method is called when the pool needs to cleaned. It closes all open sessions
+     * and the connection.
+     */
+    private void cleanSessionPool()
+    {
+        final Connection connection ;
+        synchronized(this)
+       {
+            if (terminated)
+            {
+                return ;
+            }
+            id++ ;
+            for (List<JmsSession> list : freeSessionsMap.values())
+            {
+                list.clear() ;
+            }
+            for (List<JmsSession> list : inUseSessionsMap.values())
+            {
+                list.clear() ;
+            }
+            transactionsToSessions.clear() ;
+            sessionsToTransactions.clear() ;
+            
+            logger.debug("Cleared the session pool now closing the connection to the factory.");
+            connection = jmsConnection ;
+            jmsConnection = null ;
+        }
+        if (connection!=null) {
+            try {
+                connection.close();
+            } catch (final Exception ex) {} // ignore
+        }
+    }
+    
+    /**
      * This method is called when the pool needs to destroyed. It closes all open sessions
      * and the connection and removes it from the container's poolMap.
      */
@@ -436,7 +481,7 @@
                 jmsConnection.setExceptionListener(new ExceptionListener() {
                     public void onException(JMSException arg0)
                     {
-                        removeSessionPool() ;
+                        cleanSessionPool() ;
                     }
                 }) ;
                 jmsConnection.start();

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsSession.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsSession.java	2008-06-11 09:20:40 UTC (rev 20416)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsSession.java	2008-06-11 11:39:46 UTC (rev 20417)
@@ -52,6 +52,10 @@
      * The session delegate.
      */
     private final Session session ;
+    /**
+     * The pool instance id.
+     */
+    private final long id ;
     
     /**
      * The set of active queue browsers.
@@ -69,15 +73,22 @@
     /**
      * Create the session wrapper.
      * @param session The session delegate.
+     * @param id The pool instance id.
      * @param isJTA True if this tales part in a JTA transaction
      * @throws JMSException
      */
-    JmsSession(final Session session)
+    JmsSession(final Session session, final long id)
         throws JMSException
     {
+        this.id = id ;
         this.session = session ;
     }
 
+    public long getId()
+    {
+        return id ;
+    }
+    
     public void close() throws JMSException
     {
         session.close();

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsXASession.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsXASession.java	2008-06-11 09:20:40 UTC (rev 20416)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsXASession.java	2008-06-11 11:39:46 UTC (rev 20417)
@@ -72,13 +72,13 @@
      * Create the session wrapper.
      * @param pool The current connection pool
      * @param session The session delegate.
-     * @param isJTA True if this tales part in a JTA transaction
+     * @param id The pool instance id.
      * @throws JMSException
      */
-    JmsXASession(final JmsConnectionPool pool, final XASession session)
+    JmsXASession(final JmsConnectionPool pool, final XASession session, final long id)
         throws JMSException
     {
-        super(session) ;
+        super(session, id) ;
         this.pool = pool ;
         this.session = session ;
     }




More information about the jboss-svn-commits mailing list