[jboss-cvs] JBoss Messaging SVN: r2146 - in trunk: src/main/org/jboss/jms/server and 4 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Feb 2 11:53:27 EST 2007


Author: timfox
Date: 2007-02-02 11:53:27 -0500 (Fri, 02 Feb 2007)
New Revision: 2146

Modified:
   trunk/src/main/org/jboss/jms/client/container/JmsClientAspectXMLLoader.java
   trunk/src/main/org/jboss/jms/server/ServerPeer.java
   trunk/src/main/org/jboss/jms/server/connectionfactory/ConnectionFactoryJNDIMapper.java
   trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
   trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionFactoryEndpoint.java
   trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
   trunk/src/main/org/jboss/jms/tx/MessagingXAResource.java
   trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriberTest.java
   trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java
Log:
Finish fix for http://jira.jboss.com/jira/browse/JBMESSAGING-791, also http://jira.jboss.com/jira/browse/JBMESSAGING-797


Modified: trunk/src/main/org/jboss/jms/client/container/JmsClientAspectXMLLoader.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/container/JmsClientAspectXMLLoader.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/src/main/org/jboss/jms/client/container/JmsClientAspectXMLLoader.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -61,37 +61,43 @@
     */
    public void deployXML(byte[] config) throws Exception
    {
-      InputStream is = null;
       
-      try
-      {
-         is = new ByteArrayInputStream(config);      
-      
-         DocumentBuilderFactory docBuilderFactory = null;
+      //We need to synchronized to prevent a deadlock
+      //See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {         
+         InputStream is = null;
          
-         docBuilderFactory = DocumentBuilderFactory.newInstance();
+         try
+         {
+            is = new ByteArrayInputStream(config);      
          
-         docBuilderFactory.setValidating(false);
-         
-         InputSource source = new InputSource(is);
-         
-         URL url = AspectXmlLoader.class.getResource("/jboss-aop_1_0.dtd");
-         
-         source.setSystemId(url.toString());
-         
-         DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
-         
-         docBuilder.setEntityResolver(new Resolver());
-         
-         Document doc = docBuilder.parse(source);
-         
-         this.deployXML(doc, null);              
-      }
-      finally
-      {
-         if (is != null)
+            DocumentBuilderFactory docBuilderFactory = null;
+            
+            docBuilderFactory = DocumentBuilderFactory.newInstance();
+            
+            docBuilderFactory.setValidating(false);
+            
+            InputSource source = new InputSource(is);
+            
+            URL url = AspectXmlLoader.class.getResource("/jboss-aop_1_0.dtd");
+            
+            source.setSystemId(url.toString());
+            
+            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+            
+            docBuilder.setEntityResolver(new Resolver());
+            
+            Document doc = docBuilder.parse(source);
+            
+            this.deployXML(doc, null);              
+         }
+         finally
          {
-            is.close();
+            if (is != null)
+            {
+               is.close();
+            }
          }
       }
    }

Modified: trunk/src/main/org/jboss/jms/server/ServerPeer.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/ServerPeer.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/src/main/org/jboss/jms/server/ServerPeer.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -33,6 +33,7 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 
+import javax.jms.InvalidClientIDException;
 import javax.management.Attribute;
 import javax.management.InstanceNotFoundException;
 import javax.management.MBeanServer;
@@ -44,6 +45,7 @@
 import org.jboss.jms.server.connectionmanager.SimpleConnectionManager;
 import org.jboss.jms.server.connectormanager.SimpleConnectorManager;
 import org.jboss.jms.server.destination.ManagedQueue;
+import org.jboss.jms.server.endpoint.ServerConnectionEndpoint;
 import org.jboss.jms.server.endpoint.ServerSessionEndpoint;
 import org.jboss.jms.server.messagecounter.MessageCounter;
 import org.jboss.jms.server.messagecounter.MessageCounterManager;
@@ -1219,6 +1221,28 @@
       }
    }
    
+   public void checkClientID(String clientID) throws Exception
+   {   
+      // verify the clientID is unique
+   
+      // JMS 1.1 Specifications, Section 4.3.2:
+      // "By definition, the client state identified by a client identifier can be ‘in use’ by
+      // only one client at a time. A JMS provider must prevent concurrently executing clients
+      // from using it."
+         
+      List conns = connectionManager.getActiveConnections();
+   
+      for(Iterator i = conns.iterator(); i.hasNext(); )
+      {
+         ServerConnectionEndpoint sce = (ServerConnectionEndpoint)i.next();
+         if (clientID != null && clientID.equals(sce.getClientID()))
+         {
+            throw new InvalidClientIDException(
+               "Client ID '" + clientID + "' already used by " + sce);
+         }
+      }
+   }
+   
    public String toString()
    {
       return "ServerPeer[" + getServerPeerID() + "]";

Modified: trunk/src/main/org/jboss/jms/server/connectionfactory/ConnectionFactoryJNDIMapper.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/connectionfactory/ConnectionFactoryJNDIMapper.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/src/main/org/jboss/jms/server/connectionfactory/ConnectionFactoryJNDIMapper.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -36,6 +36,7 @@
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
+import org.jboss.aop.AspectManager;
 import org.jboss.jms.client.JBossConnectionFactory;
 import org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate;
 import org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate;
@@ -46,6 +47,7 @@
 import org.jboss.jms.server.ServerPeer;
 import org.jboss.jms.server.Version;
 import org.jboss.jms.server.endpoint.ServerConnectionFactoryEndpoint;
+import org.jboss.jms.server.endpoint.advised.ConnectionAdvised;
 import org.jboss.jms.server.endpoint.advised.ConnectionFactoryAdvised;
 import org.jboss.jms.util.JNDIUtil;
 import org.jboss.jms.wireformat.Dispatcher;
@@ -188,11 +190,19 @@
 
       // Now bind it in JNDI
       rebindConnectionFactory(initialContext, jndiBindings, delegate);
+      
+      ConnectionFactoryAdvised advised;
+      
+      // Need to synchronized to prevent a deadlock
+      // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {       
+         advised = new ConnectionFactoryAdvised(endpoint);
+      }
 
       // Registering with the dispatcher should always be the last thing otherwise a client could
       // use a partially initialised object
-      Dispatcher.instance.
-         registerTarget(id, new ConnectionFactoryAdvised(endpoint));
+      Dispatcher.instance.registerTarget(id, advised);
    }
 
    public synchronized void unregisterConnectionFactory(String uniqueName, boolean clustered)

Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -33,6 +33,7 @@
 import javax.jms.JMSException;
 import javax.jms.InvalidClientIDException;
 
+import org.jboss.aop.AspectManager;
 import org.jboss.jms.client.delegate.ClientSessionDelegate;
 import org.jboss.jms.client.remoting.CallbackManager;
 import org.jboss.jms.delegate.SessionDelegate;
@@ -42,6 +43,7 @@
 import org.jboss.jms.server.JMSCondition;
 import org.jboss.jms.server.SecurityManager;
 import org.jboss.jms.server.ServerPeer;
+import org.jboss.jms.server.endpoint.advised.ConsumerAdvised;
 import org.jboss.jms.server.endpoint.advised.SessionAdvised;
 import org.jboss.jms.server.messagecounter.MessageCounter;
 import org.jboss.jms.server.remoting.JMSWireFormat;
@@ -235,8 +237,17 @@
             sessions.put(new Integer(sessionID), ep);
          }
          
-         SessionAdvised sessionAdvised = new SessionAdvised(ep);
+         SessionAdvised advised;
          
+         // Need to synchronized to prevent a deadlock
+         // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+         synchronized (AspectManager.instance())
+         {       
+            advised = new SessionAdvised(ep);
+         }
+         
+         SessionAdvised sessionAdvised = advised;
+         
          Integer iSessionID = new Integer(sessionID);
          
          serverPeer.addSession(iSessionID, ep);
@@ -287,26 +298,8 @@
             throw new IllegalStateException("Cannot set clientID, already set as " + this.clientID);
          }
 
-         // verify the clientID is unique
+         serverPeer.checkClientID(clientID);
 
-         // JMS 1.1 Specifications, Section 4.3.2:
-         // "By definition, the client state identified by a client identifier can be ‘in use’ by
-         // only one client at a time. A JMS provider must prevent concurrently executing clients
-         // from using it."
-
-         ConnectionManager cm = serverPeer.getConnectionManager();
-         List conns = cm.getActiveConnections();
-
-         for(Iterator i = conns.iterator(); i.hasNext(); )
-         {
-            ServerConnectionEndpoint sce = (ServerConnectionEndpoint)i.next();
-            if (clientID != null && clientID.equals(sce.getClientID()))
-            {
-               throw new InvalidClientIDException(
-                  "Client ID '" + clientID + "' already used by " + sce);
-            }
-         }
-
          log.debug(this + "setting client ID to " + clientID);
 
          this.clientID = clientID;

Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionFactoryEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionFactoryEndpoint.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionFactoryEndpoint.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -27,6 +27,7 @@
 
 import javax.jms.JMSException;
 
+import org.jboss.aop.AspectManager;
 import org.jboss.jms.client.delegate.ClientConnectionDelegate;
 import org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate;
 import org.jboss.jms.server.ServerPeer;
@@ -198,6 +199,8 @@
          {
             clientID = preconfClientID;
          }
+         
+         serverPeer.checkClientID(clientID);
       }
 
       // create the corresponding "server-side" connection endpoint and register it with the
@@ -211,13 +214,25 @@
 
       int connectionID = endpoint.getConnectionID();
 
-      ConnectionAdvised connAdvised = new ConnectionAdvised(endpoint);
-
+      ConnectionAdvised connAdvised;
+      
+      // Need to synchronized to prevent a deadlock
+      // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {       
+         connAdvised = new ConnectionAdvised(endpoint);
+      }
+      
       Dispatcher.instance.registerTarget(connectionID, connAdvised);
 
       log.debug("created and registered " + endpoint);
 
-      return new ClientConnectionDelegate(connectionID, serverPeer.getServerPeerID());
+      // Need to synchronized to prevent a deadlock
+      // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {         
+         return new ClientConnectionDelegate(connectionID, serverPeer.getServerPeerID());
+      }
    }
    
    public IDBlock getIdBlock(int size) throws JMSException

Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -38,6 +38,7 @@
 import javax.jms.InvalidDestinationException;
 import javax.jms.JMSException;
 
+import org.jboss.aop.AspectManager;
 import org.jboss.jms.client.delegate.ClientBrowserDelegate;
 import org.jboss.jms.client.delegate.ClientConsumerDelegate;
 import org.jboss.jms.delegate.BrowserDelegate;
@@ -56,6 +57,7 @@
 import org.jboss.jms.server.destination.ManagedTopic;
 import org.jboss.jms.server.destination.TopicService;
 import org.jboss.jms.server.endpoint.advised.BrowserAdvised;
+import org.jboss.jms.server.endpoint.advised.ConnectionFactoryAdvised;
 import org.jboss.jms.server.endpoint.advised.ConsumerAdvised;
 import org.jboss.jms.server.messagecounter.MessageCounter;
 import org.jboss.jms.util.ExceptionUtil;
@@ -1206,7 +1208,16 @@
                                     binding.getQueue().getName(), this, selectorString, noLocal,
                                     jmsDestination, dlqToUse, expiryQueueToUse, redeliveryDelay);
 
-      Dispatcher.instance.registerTarget(consumerID, new ConsumerAdvised(ep));
+      ConsumerAdvised advised;
+      
+      // Need to synchronized to prevent a deadlock
+      // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {       
+         advised = new ConsumerAdvised(ep);
+      }      
+            
+      Dispatcher.instance.registerTarget(consumerID, advised);
 
       ClientConsumerDelegate stub =
          new ClientConsumerDelegate(consumerID, newChannelID, prefetchSize, maxDeliveryAttempts);
@@ -1522,8 +1533,17 @@
                   binding.getQueue().getName(), this, selectorString, noLocal,
                   jmsDestination, dlqToUse, expiryQueueToUse, redeliveryDelay);
       
-      Dispatcher.instance.registerTarget(consumerID, new ConsumerAdvised(ep));
+      ConsumerAdvised advised;
       
+      // Need to synchronized to prevent a deadlock
+      // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {       
+         advised = new ConsumerAdvised(ep);
+      }
+      
+      Dispatcher.instance.registerTarget(consumerID, advised);
+      
       ClientConsumerDelegate stub =
          new ClientConsumerDelegate(consumerID, binding.getQueue().getChannelID(),
                                     prefetchSize, maxDeliveryAttempts);
@@ -1585,7 +1605,17 @@
       int browserID = connectionEndpoint.getServerPeer().getNextObjectID();
 
       ServerBrowserEndpoint ep = new ServerBrowserEndpoint(this, browserID, newChannel, selector);
-      Dispatcher.instance.registerTarget(browserID, new BrowserAdvised(ep));
+      
+      BrowserAdvised advised;
+      
+      // Need to synchronized to prevent a deadlock
+      // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {       
+         advised = new BrowserAdvised(ep);
+      }
+      
+      Dispatcher.instance.registerTarget(browserID, advised);
 
       // still need to synchronized since close() can come in on a different thread
       synchronized (browsers)
@@ -1635,7 +1665,16 @@
          browsers.put(new Integer(browserID), ep);
       }
 
-      Dispatcher.instance.registerTarget(browserID, new BrowserAdvised(ep));
+      BrowserAdvised advised;
+      
+      // Need to synchronized to prevent a deadlock
+      // See http://jira.jboss.com/jira/browse/JBMESSAGING-797
+      synchronized (AspectManager.instance())
+      {       
+         advised = new BrowserAdvised(ep);
+      }
+      
+      Dispatcher.instance.registerTarget(browserID, advised);
 
       ClientBrowserDelegate stub =
          new ClientBrowserDelegate(browserID, binding.getQueue().getChannelID());

Modified: trunk/src/main/org/jboss/jms/tx/MessagingXAResource.java
===================================================================
--- trunk/src/main/org/jboss/jms/tx/MessagingXAResource.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/src/main/org/jboss/jms/tx/MessagingXAResource.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -140,6 +140,7 @@
          if (trace) { log.trace("Converting local tx into global tx branch"); }
       }      
 
+      //TODO why do we need this synchronized block?
       synchronized (this)
       {
          switch (flags)
@@ -184,22 +185,26 @@
          xid = new MessagingXid(xid.getBranchQualifier(), xid.getFormatId(), xid.getGlobalTransactionId());
       }
 
-      unsetCurrentTransactionId(xid);    
-      
-      switch (flags)
-      {
-         case TMSUSPEND :                                    
-            rm.suspendTx(xid);
-            break;
-         case TMFAIL :
-            rm.endTx(xid, false);
-            break;
-         case TMSUCCESS :
-            rm.endTx(xid, true);
-            break;
-         default :
-            throw new MessagingXAException(XAException.XAER_PROTO, "Invalid flags: " + flags);         
-      }      
+      //TODO - why do we need this synchronized block?
+      synchronized (this)
+      {         
+         unsetCurrentTransactionId(xid);    
+         
+         switch (flags)
+         {
+            case TMSUSPEND :                                    
+               rm.suspendTx(xid);
+               break;
+            case TMFAIL :
+               rm.endTx(xid, false);
+               break;
+            case TMSUCCESS :
+               rm.endTx(xid, true);
+               break;
+            default :
+               throw new MessagingXAException(XAException.XAER_PROTO, "Invalid flags: " + flags);         
+         }      
+      }
    }
    
    public int prepare(Xid xid) throws XAException

Modified: trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriberTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriberTest.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriberTest.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -350,6 +350,8 @@
       {
          // OK
       }
+      
+      conn.close();
    }
 
    /**

Modified: trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java	2007-02-02 16:46:20 UTC (rev 2145)
+++ trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java	2007-02-02 16:53:27 UTC (rev 2146)
@@ -2678,6 +2678,8 @@
 
          Message m = durable4.receive(1000);
          assertNull(m);
+         
+         conn3.close();
 
       }
       finally




More information about the jboss-cvs-commits mailing list