[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