You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2015/03/09 18:12:16 UTC

svn commit: r1665306 [1/3] - in /qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java: bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/ broker-core/src/main/java/org/apache/qpid/server/ broker-core/src/main/java/org/apache/qpid/serv...

Author: kwall
Date: Mon Mar  9 17:12:14 2015
New Revision: 1665306

URL: http://svn.apache.org/r1665306
Log:
Add sync/async varients to most ACO methods

Modified:
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/ExchangeImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObjectTypeFactory.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/PortFactory.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/ConfiguredObjectTypeFactory.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueFactory.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStoreImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaTrustStoreImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AbstractAuthenticationManager.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/ConfigModelPasswordManagingAuthenticationProvider.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/ManagedUser.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupMemberImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostNodeImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/HeadersBindingTest.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/VirtualHostTest.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/lifecycle/TestConfiguredObject.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/test/java/org/apache/qpid/server/queue/AbstractQueueTestBase.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/AbstractVirtualHostTest.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderFactoryTest.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNodeConsumer.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/HttpManagementTest.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/systests/src/test/java/org/apache/qpid/server/store/VirtualHostMessageStoreTest.java
    qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/LogRecordsRestTest.java

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java Mon Mar  9 17:12:14 2015
@@ -24,11 +24,12 @@ package org.apache.qpid.server.virtualho
 import java.security.AccessControlException;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
 
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import com.sleepycat.je.rep.MasterStateException;
-
 import org.apache.log4j.Logger;
+
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.messages.HighAvailabilityMessages;
@@ -150,7 +151,7 @@ public class BDBHARemoteReplicationNodeI
     }
 
     @StateTransition(currentState = {State.ACTIVE, State.UNAVAILABLE}, desiredState = State.DELETED)
-    private void doDelete()
+    private ListenableFuture<Void> doDelete()
     {
         String nodeName = getName();
 
@@ -170,6 +171,8 @@ public class BDBHARemoteReplicationNodeI
         {
             throw new IllegalStateTransitionException("Unexpected exception on node '" + nodeName + "' deletion", e);
         }
+
+        return Futures.immediateFuture(null);
     }
 
     protected void afterSetRole()

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java Mon Mar  9 17:12:14 2015
@@ -42,6 +42,10 @@ import java.util.concurrent.atomic.Atomi
 
 import javax.security.auth.Subject;
 
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
 import com.sleepycat.je.DatabaseException;
 import com.sleepycat.je.LogWriteException;
 import com.sleepycat.je.rep.NodeState;
@@ -318,7 +322,7 @@ public class BDBHAVirtualHostNodeImpl ex
     }
 
     @Override
-    protected void activate()
+    protected ListenableFuture<Void> activate()
     {
         if (LOGGER.isDebugEnabled())
         {
@@ -352,6 +356,7 @@ public class BDBHAVirtualHostNodeImpl ex
                 {
                     getEventLogger().message(getGroupLogSubject(), HighAvailabilityMessages.INTRUDER_DETECTED(node.getName(), nodeAddress));
                     shutdownOnIntruder(nodeAddress);
+
                     throw new IllegalStateException("Intruder node detected: " + nodeAddress);
                 }
             }
@@ -367,24 +372,49 @@ public class BDBHAVirtualHostNodeImpl ex
             environmentFacade.setReplicationGroupListener(new RemoteNodesDiscoverer());
             environmentFacade.setPermittedNodes(_permittedNodes);
         }
+
+        return Futures.immediateFuture(null);
     }
 
     @StateTransition( currentState = { State.UNINITIALIZED, State.ACTIVE, State.ERRORED }, desiredState = State.STOPPED )
-    protected void doStop()
+    protected ListenableFuture<Void> doStop()
     {
-        try
-        {
-            super.doStop();
-        }
-        finally
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+
+        ListenableFuture<Void> superFuture = super.doStop();
+        Futures.addCallback(superFuture, new FutureCallback<Void>()
         {
-            closeEnvironment();
+            @Override
+            public void onSuccess(final Void result)
+            {
+                doFinally();
+            }
 
-            // closing the environment does not cause a state change.  Adjust the role
-            // so that our observers will see DETACHED rather than our previous role in the group.
-            _lastRole.set(NodeRole.DETACHED);
-            attributeSet(ROLE, _role, NodeRole.DETACHED);
-        }
+            @Override
+            public void onFailure(final Throwable t)
+            {
+                doFinally();
+            }
+
+            private void doFinally()
+            {
+                try
+                {
+                    closeEnvironment();
+
+                    // closing the environment does not cause a state change.  Adjust the role
+                    // so that our observers will see DETACHED rather than our previous role in the group.
+                    _lastRole.set(NodeRole.DETACHED);
+                    attributeSet(ROLE, _role, NodeRole.DETACHED);
+                }
+                finally
+                {
+                    returnVal.set(null);
+                }
+
+            }
+        });
+        return returnVal;
     }
 
     private void closeEnvironment()
@@ -397,43 +427,60 @@ public class BDBHAVirtualHostNodeImpl ex
     }
 
     @StateTransition( currentState = { State.ACTIVE, State.STOPPED, State.ERRORED}, desiredState = State.DELETED )
-    protected void doDelete()
+    protected ListenableFuture<Void> doDelete()
     {
-        // get helpers before close. on close all children are closed and not available anymore
-        Set<InetSocketAddress> helpers = getRemoteNodeAddresses();
-        super.doDelete();
-
-        if (getConfigurationStore() != null)
-        {
-            getEventLogger().message(getVirtualHostNodeLogSubject(), HighAvailabilityMessages.DELETED());
-        }
+        final SettableFuture<Void> returnVal = SettableFuture.create();
 
-        if (getState() == State.DELETED && !helpers.isEmpty())
+        // get helpers before close. on close all children are closed and not available anymore
+        final Set<InetSocketAddress> helpers = getRemoteNodeAddresses();
+        final ListenableFuture<Void> superFuture = super.doDelete();
+        superFuture.addListener(new Runnable()
         {
-            try
-            {
-                new ReplicationGroupAdmin(_groupName, helpers).removeMember(getName());
-            }
-            catch(DatabaseException e)
+            @Override
+            public void run()
             {
-                LOGGER.warn("The deletion of node " + this + " on remote nodes failed due to: " + e.getMessage()
-                        + ". To finish deletion a removal of the node from any of remote nodes (" + helpers + ") is required.");
+                try
+                {
+                    if (getConfigurationStore() != null)
+                    {
+                        getEventLogger().message(getVirtualHostNodeLogSubject(), HighAvailabilityMessages.DELETED());
+                    }
+
+                    if (getState() == State.DELETED && !helpers.isEmpty())
+                    {
+                        try
+                        {
+                            new ReplicationGroupAdmin(_groupName, helpers).removeMember(getName());
+                        }
+                        catch(DatabaseException e)
+                        {
+                            LOGGER.warn("The deletion of node " + this + " on remote nodes failed due to: " + e.getMessage()
+                                        + ". To finish deletion a removal of the node from any of remote nodes (" + helpers + ") is required.");
+                        }
+                    }
+                }
+                finally
+                {
+                    returnVal.set(null);
+                }
             }
-        }
+        }, getTaskExecutor().getExecutor());
+
+        return returnVal;
     }
 
     @Override
-    protected void deleteVirtualHostIfExists()
+    protected ListenableFuture<Void> deleteVirtualHostIfExists()
     {
         ReplicatedEnvironmentFacade replicatedEnvironmentFacade = getReplicatedEnvironmentFacade();
         if (replicatedEnvironmentFacade != null && replicatedEnvironmentFacade.isMaster()
                 && replicatedEnvironmentFacade.getNumberOfElectableGroupMembers() == 1)
         {
-            super.deleteVirtualHostIfExists();
+            return super.deleteVirtualHostIfExists();
         }
         else
         {
-            closeVirtualHostIfExist();
+            return closeVirtualHostIfExist();
         }
     }
 
@@ -553,7 +600,7 @@ public class BDBHAVirtualHostNodeImpl ex
     {
         try
         {
-            closeVirtualHostIfExist();
+            closeVirtualHostIfExist().get();
 
             getConfigurationStore().upgradeStoreStructure();
 
@@ -640,7 +687,7 @@ public class BDBHAVirtualHostNodeImpl ex
     {
         try
         {
-            closeVirtualHostIfExist();
+            closeVirtualHostIfExist().get();
 
             Map<String, Object> hostAttributes = new HashMap<>();
             hostAttributes.put(VirtualHost.MODEL_VERSION, BrokerModel.MODEL_VERSION);
@@ -654,13 +701,32 @@ public class BDBHAVirtualHostNodeImpl ex
         }
     }
 
-    protected void closeVirtualHostIfExist()
+    protected ListenableFuture<Void> closeVirtualHostIfExist()
     {
-        VirtualHost<?,?,?> virtualHost = getVirtualHost();
+        final VirtualHost<?,?,?> virtualHost = getVirtualHost();
         if (virtualHost!= null)
         {
-            virtualHost.close();
-            childRemoved(virtualHost);
+            final SettableFuture<Void> returnVal = SettableFuture.create();
+            virtualHost.closeAsync().addListener(new Runnable()
+            {
+                @Override
+                public void run()
+                {
+                    try
+                    {
+                        childRemoved(virtualHost);
+                    }
+                    finally
+                    {
+                        returnVal.set(null);
+                    }
+                }
+            }, getTaskExecutor().getExecutor());
+            return returnVal;
+        }
+        else
+        {
+            return Futures.immediateFuture(null);
         }
     }
 
@@ -687,15 +753,19 @@ public class BDBHAVirtualHostNodeImpl ex
                         onReplica();
                         break;
                     case DETACHED:
-                        closeVirtualHostIfExist();
+                        closeVirtualHostIfExist().get();
                         break;
                     case UNKNOWN:
-                        closeVirtualHostIfExist();
+                        closeVirtualHostIfExist().get();
                         break;
                     default:
                         LOGGER.error("Unexpected state change: " + state);
                 }
             }
+            catch (InterruptedException | ExecutionException e)
+            {
+                throw new ServerScopedRuntimeException(e);
+            }
             finally
             {
                 NodeRole newRole = NodeRole.fromJeState(state);
@@ -1137,7 +1207,7 @@ public class BDBHAVirtualHostNodeImpl ex
 
                 try
                 {
-                    close();
+                    closeAsync();
                 }
                 finally
                 {

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java Mon Mar  9 17:12:14 2015
@@ -110,8 +110,8 @@ public class Broker implements BrokerShu
             {
                 if(_systemConfig != null)
                 {
-                    ListenableFuture<Void> closeResult = _systemConfig.close();
-                    closeResult.get(5000l, TimeUnit.MILLISECONDS);
+                    ListenableFuture<Void> closeResult = _systemConfig.closeAsync();
+                    closeResult.get(30000l, TimeUnit.MILLISECONDS);
                 }
                 _taskExecutor.stop();
 

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java Mon Mar  9 17:12:14 2015
@@ -28,6 +28,9 @@ import java.util.concurrent.CopyOnWriteA
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.VoidTask;
 import org.apache.qpid.server.exchange.AbstractExchange;
@@ -195,7 +198,7 @@ public class BindingImpl
     }
 
     @StateTransition(currentState = State.ACTIVE, desiredState = State.DELETED)
-    private void doDelete()
+    private ListenableFuture<Void> doDelete()
     {
         if(_deleted.compareAndSet(false,true))
         {
@@ -208,12 +211,14 @@ public class BindingImpl
 
         deleted();
         setState(State.DELETED);
+        return Futures.immediateFuture(null);
     }
 
     @StateTransition(currentState = State.UNINITIALIZED, desiredState = State.ACTIVE)
-    private void activate()
+    private ListenableFuture<Void> activate()
     {
         setState(State.ACTIVE);
+        return Futures.immediateFuture(null);
     }
 
     public void addStateChangeListener(StateChangeListener<BindingImpl,State> listener)

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java Mon Mar  9 17:12:14 2015
@@ -49,6 +49,7 @@ public class TaskExecutorImpl implements
     private volatile Thread _taskThread;
     private final AtomicBoolean _running = new AtomicBoolean();
     private volatile ExecutorService _executor;
+    private final ImmediateIfSameThreadExecutor _wrappedExecutor = new ImmediateIfSameThreadExecutor();
 
 
     @Override
@@ -68,7 +69,7 @@ public class TaskExecutorImpl implements
                 @Override
                 public Thread newThread(Runnable r)
                 {
-                    _taskThread = new Thread(r, TASK_EXECUTION_THREAD_NAME);
+                    _taskThread = new TaskThread(r, TASK_EXECUTION_THREAD_NAME, TaskExecutorImpl.this);
                     return _taskThread;
                 }
             });
@@ -281,7 +282,7 @@ public class TaskExecutorImpl implements
     @Override
     public Executor getExecutor()
     {
-        return _executor;
+        return _wrappedExecutor;
     }
 
     public boolean isTaskExecutorThread()
@@ -380,4 +381,41 @@ public class TaskExecutorImpl implements
             return get();
         }
     }
+
+    private class ImmediateIfSameThreadExecutor implements Executor
+    {
+
+        @Override
+        public void execute(final Runnable command)
+        {
+            if(isTaskExecutorThread()
+               || (_executor == null && (Thread.currentThread() instanceof TaskThread
+                   && ((TaskThread)Thread.currentThread()).getTaskExecutor() == TaskExecutorImpl.this)))
+            {
+                command.run();
+            }
+            else
+            {
+                _executor.execute(command);
+            }
+
+        }
+    }
+
+    private static class TaskThread extends Thread
+    {
+
+        private final TaskExecutorImpl _taskExecutor;
+
+        public TaskThread(final Runnable r, final String name, final TaskExecutorImpl taskExecutor)
+        {
+            super(r, name);
+            _taskExecutor = taskExecutor;
+        }
+
+        public TaskExecutorImpl getTaskExecutor()
+        {
+            return _taskExecutor;
+        }
+    }
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java Mon Mar  9 17:12:14 2015
@@ -67,7 +67,7 @@ public interface ConsumerImpl
 
     boolean seesRequeues();
 
-    ListenableFuture<Void> close();
+    void close();
 
     boolean trySendLock();
 

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java Mon Mar  9 17:12:14 2015
@@ -37,10 +37,13 @@ import java.util.concurrent.atomic.Atomi
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import org.apache.log4j.Logger;
 
 import org.apache.qpid.exchange.ExchangeDefaults;
 import org.apache.qpid.server.binding.BindingImpl;
+import org.apache.qpid.server.configuration.updater.Task;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.logging.messages.ExchangeMessages;
@@ -602,9 +605,18 @@ public abstract class AbstractExchange<T
     }
 
     @Override
-    public boolean addBinding(String bindingKey, AMQQueue queue, Map<String, Object> arguments)
+    public boolean addBinding(final String bindingKey, final AMQQueue queue, final Map<String, Object> arguments)
     {
-        return makeBinding(null, bindingKey, queue, arguments, false);
+        return getTaskExecutor().run(new Task<Boolean>()
+                                    {
+
+                                        @Override
+                                        public Boolean execute()
+                                        {
+                                            return makeBinding(null, bindingKey, queue, arguments, false);
+                                        }
+                                    });
+
     }
 
     @Override
@@ -643,7 +655,15 @@ public abstract class AbstractExchange<T
             doRemoveBinding(b);
             queue.removeBinding(b);
 
-            b.delete();
+            // TODO - RG - Fix bindings!
+            if(getTaskExecutor().isTaskExecutorThread())
+            {
+                b.deleteAsync();
+            }
+            else
+            {
+                b.delete();
+            }
         }
 
     }
@@ -695,7 +715,8 @@ public abstract class AbstractExchange<T
                 attributes.put(Binding.ARGUMENTS, arguments);
 
                 BindingImpl b = new BindingImpl(attributes, queue, this);
-                b.create(); // Must be called before addBinding as it resolves automated attributes.
+                // TODO - RG - Fix Bindings
+                b.createAsync(); // Must be called before addBinding as it resolves automated attributes.
 
                 addBinding(b);
                 return true;
@@ -732,22 +753,24 @@ public abstract class AbstractExchange<T
 
 
     @StateTransition(currentState = {State.UNINITIALIZED,State.ERRORED}, desiredState = State.ACTIVE)
-    private void activate()
+    private ListenableFuture<Void> activate()
     {
         setState(State.ACTIVE);
+        return Futures.immediateFuture(null);
     }
 
 
     @StateTransition(currentState = State.UNINITIALIZED, desiredState = State.DELETED)
-    private void doDeleteBeforeInitialize()
+    private ListenableFuture<Void>  doDeleteBeforeInitialize()
     {
         preSetAlternateExchange();
         setState(State.DELETED);
+        return Futures.immediateFuture(null);
     }
 
 
     @StateTransition(currentState = State.ACTIVE, desiredState = State.DELETED)
-    private void doDelete()
+    private ListenableFuture<Void> doDelete()
     {
         try
         {
@@ -757,8 +780,9 @@ public abstract class AbstractExchange<T
         }
         catch (ExchangeIsAlternateException | RequiredExchangeException e)
         {
-            return;
+
         }
+        return Futures.immediateFuture(null);
     }
 
     @Override

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/ExchangeImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/ExchangeImpl.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/ExchangeImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/ExchangeImpl.java Mon Mar  9 17:12:14 2015
@@ -107,8 +107,4 @@ public interface ExchangeImpl<T extends
         void bindingRemoved(ExchangeImpl exchange, BindingImpl binding);
     }
 
-    public void addBindingListener(BindingListener listener);
-
-    public void removeBindingListener(BindingListener listener);
-
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java Mon Mar  9 17:12:14 2015
@@ -43,12 +43,14 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.security.auth.Subject;
 
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -169,7 +171,7 @@ public abstract class AbstractConfigured
 
     private final OwnAttributeResolver _attributeResolver = new OwnAttributeResolver(this);
 
-    @ManagedAttributeField( afterSet = "attainStateIfOpenedOrReopenFailed" )
+    @ManagedAttributeField
     private State _desiredState;
     private boolean _openComplete;
     private boolean _openFailed;
@@ -446,24 +448,58 @@ public abstract class AbstractConfigured
     @Override
     public final void open()
     {
-        if(_dynamicState.compareAndSet(DynamicState.UNINIT, DynamicState.OPENED))
+        doSync(openAsync());
+    }
+
+
+    public final ListenableFuture<Void> openAsync()
+    {
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+
+        _taskExecutor.run(new VoidTask()
         {
-            _openFailed = false;
-            OpenExceptionHandler exceptionHandler = new OpenExceptionHandler();
-            try
-            {
-                doResolution(true, exceptionHandler);
-                doValidation(true, exceptionHandler);
-                doOpening(true, exceptionHandler);
-                doAttainState(exceptionHandler);
-            }
-            catch(RuntimeException e)
+
+            @Override
+            public void execute()
             {
-                exceptionHandler.handleException(e, this);
+                if (_dynamicState.compareAndSet(DynamicState.UNINIT, DynamicState.OPENED))
+                {
+                    _openFailed = false;
+                    OpenExceptionHandler exceptionHandler = new OpenExceptionHandler();
+                    try
+                    {
+                        doResolution(true, exceptionHandler);
+                        doValidation(true, exceptionHandler);
+                        doOpening(true, exceptionHandler);
+                        doAttainState(exceptionHandler).addListener(
+                                new Runnable()
+                                {
+                                    @Override
+                                    public void run()
+                                    {
+                                        returnVal.set(null);
+                                    }
+                                }, MoreExecutors.sameThreadExecutor()
+                                                                   );
+                    }
+                    catch (RuntimeException e)
+                    {
+                        exceptionHandler.handleException(e, AbstractConfiguredObject.this);
+                        returnVal.set(null);
+                    }
+                }
+                else
+                {
+                    returnVal.set(null);
+                }
             }
-        }
+        });
+        return returnVal;
+
     }
 
+
+
     public void registerWithParents()
     {
         for(ConfiguredObject<?> parent : _parents.values())
@@ -475,7 +511,7 @@ public abstract class AbstractConfigured
         }
     }
 
-    private static class ChildCounter
+    private class ChildCounter
     {
         private final AtomicInteger _count = new AtomicInteger();
         private final Runnable _task;
@@ -501,8 +537,6 @@ public abstract class AbstractConfigured
 
     protected final ListenableFuture<Void> closeChildren()
     {
-        LOGGER.debug("KWDEBUG closing children");
-
         final SettableFuture<Void> returnVal = SettableFuture.create();
         final ChildCounter counter = new ChildCounter(new Runnable()
         {
@@ -510,6 +544,8 @@ public abstract class AbstractConfigured
             public void run()
             {
                 returnVal.set(null);
+                LOGGER.debug("All children closed " + AbstractConfiguredObject.this.getClass().getSimpleName() + " : " + getName() );
+
             }
         });
         counter.incrementCount();
@@ -521,7 +557,7 @@ public abstract class AbstractConfigured
             public void performAction(final ConfiguredObject<?> child)
             {
                 counter.incrementCount();
-                ListenableFuture<Void> close = child.close();
+                ListenableFuture<Void> close = child.closeAsync();
                 close.addListener(new Runnable()
                 {
                     @Override
@@ -554,8 +590,15 @@ public abstract class AbstractConfigured
     }
 
     @Override
-    public final ListenableFuture<Void> close()
+    public void close()
+    {
+        doSync(closeAsync());
+    }
+
+    @Override
+    public final ListenableFuture<Void> closeAsync()
     {
+        LOGGER.debug("Closing " + getClass().getSimpleName() + " : " + getName());
         if(_dynamicState.compareAndSet(DynamicState.OPENED, DynamicState.CLOSED))
         {
             final SettableFuture<Void> returnVal = SettableFuture.create();
@@ -577,6 +620,7 @@ public abstract class AbstractConfigured
                             {
                                 onClose();
                                 unregister(false);
+                                LOGGER.debug("Closed " + AbstractConfiguredObject.this.getClass().getSimpleName() + " : " + getName());
                                 returnVal.set(null);
                             }
                         }, getTaskExecutor().getExecutor());
@@ -591,8 +635,13 @@ public abstract class AbstractConfigured
                     @Override
                     public void run()
                     {
+
                         onClose();
                         unregister(false);
+                        LOGGER.debug("Closed "
+                                     + AbstractConfiguredObject.this.getClass().getSimpleName()
+                                     + " : "
+                                     + getName());
                         returnVal.set(null);
                     }
                 }, getTaskExecutor().getExecutor());
@@ -604,6 +653,8 @@ public abstract class AbstractConfigured
         }
         else
         {
+            LOGGER.debug("Closed " + getClass().getSimpleName() + " : " + getName());
+
             return Futures.immediateFuture(null);
         }
     }
@@ -619,48 +670,88 @@ public abstract class AbstractConfigured
 
     public final void create()
     {
-        if(_dynamicState.compareAndSet(DynamicState.UNINIT, DynamicState.OPENED))
+        doSync(createAsync());
+    }
+
+    public final ListenableFuture<Void> createAsync()
+    {
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+
+        _taskExecutor.run(new VoidTask()
         {
-            final AuthenticatedPrincipal currentUser = SecurityManager.getCurrentUser();
-            if(currentUser != null)
-            {
-                String currentUserName = currentUser.getName();
-                _attributes.put(LAST_UPDATED_BY, currentUserName);
-                _attributes.put(CREATED_BY, currentUserName);
-                _lastUpdatedBy = currentUserName;
-                _createdBy = currentUserName;
-            }
-            final long currentTime = System.currentTimeMillis();
-            _attributes.put(LAST_UPDATED_TIME, currentTime);
-            _attributes.put(CREATED_TIME, currentTime);
-            _lastUpdatedTime = currentTime;
-            _createdTime = currentTime;
 
-            CreateExceptionHandler createExceptionHandler = new CreateExceptionHandler();
-            try
-            {
-                doResolution(true, createExceptionHandler);
-                doValidation(true, createExceptionHandler);
-                validateOnCreate();
-                registerWithParents();
-            }
-            catch(RuntimeException e)
+            @Override
+            public void execute()
             {
-                createExceptionHandler.handleException(e, this);
-            }
 
-            AbstractConfiguredObjectExceptionHandler unregisteringExceptionHandler = new CreateExceptionHandler(true);
-            try
-            {
-                doCreation(true, unregisteringExceptionHandler);
-                doOpening(true, unregisteringExceptionHandler);
-                doAttainState(unregisteringExceptionHandler);
-            }
-            catch(RuntimeException e)
-            {
-                unregisteringExceptionHandler.handleException(e, this);
+                if (_dynamicState.compareAndSet(DynamicState.UNINIT, DynamicState.OPENED))
+                {
+                    final AuthenticatedPrincipal currentUser = SecurityManager.getCurrentUser();
+                    if (currentUser != null)
+                    {
+                        String currentUserName = currentUser.getName();
+                        _attributes.put(LAST_UPDATED_BY, currentUserName);
+                        _attributes.put(CREATED_BY, currentUserName);
+                        _lastUpdatedBy = currentUserName;
+                        _createdBy = currentUserName;
+                    }
+                    final long currentTime = System.currentTimeMillis();
+                    _attributes.put(LAST_UPDATED_TIME, currentTime);
+                    _attributes.put(CREATED_TIME, currentTime);
+                    _lastUpdatedTime = currentTime;
+                    _createdTime = currentTime;
+
+                    CreateExceptionHandler createExceptionHandler = new CreateExceptionHandler();
+                    try
+                    {
+                        doResolution(true, createExceptionHandler);
+                        doValidation(true, createExceptionHandler);
+                        validateOnCreate();
+                        registerWithParents();
+                    }
+                    catch (RuntimeException e)
+                    {
+                        createExceptionHandler.handleException(e, AbstractConfiguredObject.this);
+                    }
+
+                    final AbstractConfiguredObjectExceptionHandler unregisteringExceptionHandler =
+                            new CreateExceptionHandler(true);
+                    try
+                    {
+                        doCreation(true, unregisteringExceptionHandler);
+                        doOpening(true, unregisteringExceptionHandler);
+                        Futures.addCallback(doAttainState(unregisteringExceptionHandler),
+                                            new FutureCallback<Void>()
+                                            {
+                                                @Override
+                                                public void onSuccess(final Void result)
+                                                {
+                                                    returnVal.set(null);
+                                                }
+
+                                                @Override
+                                                public void onFailure(final Throwable t)
+                                                {
+                                                    if (t instanceof RuntimeException)
+                                                    {
+                                                        unregisteringExceptionHandler.handleException((RuntimeException) t,
+                                                                                                      AbstractConfiguredObject.this);
+                                                    }
+                                                    returnVal.set(null);
+                                                }
+                                            },
+                                            getTaskExecutor().getExecutor());
+                    }
+                    catch (RuntimeException e)
+                    {
+                        unregisteringExceptionHandler.handleException(e, AbstractConfiguredObject.this);
+                        returnVal.set(null);
+                    }
+                }
             }
-        }
+        });
+
+        return returnVal;
     }
 
     protected void validateOnCreate()
@@ -710,8 +801,33 @@ public abstract class AbstractConfigured
     {
     }
 
-    private void doAttainState(final AbstractConfiguredObjectExceptionHandler exceptionHandler)
+    private ListenableFuture<Void> doAttainState(final AbstractConfiguredObjectExceptionHandler exceptionHandler)
     {
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+        final ChildCounter counter = new ChildCounter(new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                try
+                {
+                    attainState().addListener(new Runnable()
+                    {
+                        @Override
+                        public void run()
+                        {
+                            returnVal.set(null);
+                        }
+                    }, getTaskExecutor().getExecutor());
+                }
+                catch(RuntimeException e)
+                {
+                    returnVal.set(null);
+                    throw e;
+                }
+            }
+        });
+        counter.incrementCount();
         applyToChildren(new Action<ConfiguredObject<?>>()
         {
             @Override
@@ -719,22 +835,36 @@ public abstract class AbstractConfigured
             {
                 if (child instanceof AbstractConfiguredObject)
                 {
-                    AbstractConfiguredObject configuredObject = (AbstractConfiguredObject) child;
+                    final AbstractConfiguredObject configuredObject = (AbstractConfiguredObject) child;
                     if (configuredObject._dynamicState.get() == DynamicState.OPENED)
                     {
-                        try
-                        {
-                            configuredObject.doAttainState(exceptionHandler);
-                        }
-                        catch (RuntimeException e)
-                        {
-                            exceptionHandler.handleException(e, configuredObject);
-                        }
+                        counter.incrementCount();
+                        Futures.addCallback(configuredObject.doAttainState(exceptionHandler),
+                                            new FutureCallback()
+                                            {
+                                                @Override
+                                                public void onSuccess(final Object result)
+                                                {
+                                                    counter.decrementCount();
+                                                }
+
+                                                @Override
+                                                public void onFailure(final Throwable t)
+                                                {
+                                                    if(t instanceof RuntimeException)
+                                                    {
+                                                        exceptionHandler.handleException((RuntimeException) t, configuredObject);
+                                                    }
+                                                    counter.decrementCount();
+                                                }
+                                            },getTaskExecutor().getExecutor());
+
                     }
                 }
             }
         });
-        attainState();
+        counter.decrementCount();
+        return returnVal;
     }
 
     protected void doOpening(boolean skipCheck, final AbstractConfiguredObjectExceptionHandler exceptionHandler)
@@ -990,16 +1120,17 @@ public abstract class AbstractConfigured
         }
     }
 
-    private void attainStateIfOpenedOrReopenFailed()
+    private ListenableFuture<Void> attainStateIfOpenedOrReopenFailed()
     {
         if (_openComplete || getDesiredState() == State.DELETED)
         {
-            attainState();
+            return attainState();
         }
         else if (_openFailed)
         {
-            open();
+            return openAsync();
         }
+        return Futures.immediateFuture(null);
     }
 
     protected void onOpen()
@@ -1007,10 +1138,11 @@ public abstract class AbstractConfigured
 
     }
 
-    protected void attainState()
+    protected ListenableFuture<Void> attainState()
     {
         State currentState = getState();
         State desiredState = getDesiredState();
+        ListenableFuture<Void> returnVal;
         if(currentState != desiredState)
         {
             Method stateChangingMethod = getStateChangeMethod(currentState, desiredState);
@@ -1018,7 +1150,7 @@ public abstract class AbstractConfigured
             {
                 try
                 {
-                    stateChangingMethod.invoke(this);
+                    returnVal = (ListenableFuture<Void>) stateChangingMethod.invoke(this);
                 }
                 catch (IllegalAccessException e)
                 {
@@ -1038,7 +1170,16 @@ public abstract class AbstractConfigured
                     throw new ServerScopedRuntimeException("Unexpected checked exception when calling state transition", underlying);
                 }
             }
+            else
+            {
+                returnVal = Futures.immediateFuture(null);
+            }
         }
+        else
+        {
+            returnVal = Futures.immediateFuture(null);
+        }
+        return returnVal;
     }
 
     private Method getStateChangeMethod(final State currentState, final State desiredState)
@@ -1113,46 +1254,93 @@ public abstract class AbstractConfigured
     }
 
 
-    private State setDesiredState(final State desiredState)
+    private ListenableFuture<Void> setDesiredState(final State desiredState)
             throws IllegalStateTransitionException, AccessControlException
     {
 
-        return runTask(new Task<State>()
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+        runTask(new Task<Void>()
                         {
                             @Override
-                            public State execute()
+                            public Void execute()
                             {
 
-                                State state = getState();
-                                if(desiredState == getDesiredState() && desiredState != state)
+                                final State state = getState();
+                                final State currentDesiredState = getDesiredState();
+                                if(desiredState == currentDesiredState && desiredState != state)
                                 {
-                                    attainStateIfOpenedOrReopenFailed();
-                                    final State currentState = getState();
-                                    if (currentState != state)
+                                    attainStateIfOpenedOrReopenFailed().addListener(new Runnable()
                                     {
-                                        notifyStateChanged(state, currentState);
+                                        @Override
+                                        public void run()
+                                        {
+                                            try
+                                            {
+                                                final State currentState = getState();
+                                                if (currentState != state)
+                                                {
+                                                    notifyStateChanged(state, currentState);
+                                                }
+                                            }
+                                            finally
+                                            {
+                                                returnVal.set(null);
+                                            }
+                                        }
                                     }
-                                    return currentState;
+                                    ,_taskExecutor.getExecutor());
                                 }
                                 else
                                 {
-                                    authoriseSetDesiredState(desiredState);
+                                    try
+                                    {
+                                        authoriseSetDesiredState(desiredState);
+                                        validateChange(createProxyForValidation(Collections.<String, Object>singletonMap(
+                                                ConfiguredObject.DESIRED_STATE,
+                                                desiredState)), Collections.singleton(ConfiguredObject.DESIRED_STATE));
+
+                                        if (changeAttribute(ConfiguredObject.DESIRED_STATE, currentDesiredState, desiredState))
+                                        {
+                                            attributeSet(ConfiguredObject.DESIRED_STATE,
+                                                         currentDesiredState,
+                                                         desiredState);
 
-                                    setAttributes(Collections.<String, Object>singletonMap(DESIRED_STATE,
-                                                                                           desiredState));
+                                            attainStateIfOpenedOrReopenFailed().addListener(new Runnable()
+                                            {
+                                                @Override
+                                                public void run()
+                                                {
+                                                    try
+                                                    {
+                                                        if (getState() == desiredState)
+                                                        {
+                                                            notifyStateChanged(state, desiredState);
+                                                        }
+                                                    }
+                                                    finally
+                                                    {
+                                                        returnVal.set(null);
+                                                    }
 
-                                    if (getState() == desiredState)
-                                    {
-                                        notifyStateChanged(state, desiredState);
-                                        return desiredState;
+                                                }
+                                            }, _taskExecutor.getExecutor());
+                                        }
+                                        else
+                                        {
+                                            returnVal.set(null);
+                                        }
                                     }
-                                    else
+                                    catch (RuntimeException | Error e)
                                     {
-                                        return getState();
+                                        returnVal.set(null);
+                                        throw e;
                                     }
+
                                 }
+                                return null;
                             }
                         });
+        return returnVal;
     }
 
     @Override
@@ -1531,20 +1719,67 @@ public abstract class AbstractConfigured
 
     public final void stop()
     {
-        setDesiredState(State.STOPPED);
+        doSync(setDesiredState(State.STOPPED));
     }
 
     public final void delete()
     {
-        if(getState() == State.UNINITIALIZED)
+        doSync(deleteAsync());
+    }
+
+    private void doSync(ListenableFuture<Void> async)
+    {
+        try
+        {
+            async.get();
+        }
+        catch (InterruptedException e)
+        {
+            throw new ServerScopedRuntimeException(e);
+        }
+        catch (ExecutionException e)
+        {
+            Throwable cause = e.getCause();
+            if(cause instanceof RuntimeException)
+            {
+                throw (RuntimeException) cause;
+            }
+            else if(cause instanceof Error)
+            {
+                throw (Error) cause;
+            }
+            else if(cause != null)
+            {
+                throw new ServerScopedRuntimeException(cause);
+            }
+            else
+            {
+                throw new ServerScopedRuntimeException(e);
+            }
+
+        }
+    }
+
+    public final ListenableFuture<Void> deleteAsync()
+    {
+       /* if(getState() == State.UNINITIALIZED)
         {
             _desiredState = State.DELETED;
         }
-        setDesiredState(State.DELETED);
+       */ return setDesiredState(State.DELETED);
+
+    }
+
+    public final void start()
+    {
+        doSync(startAsync());
+    }
 
+    public ListenableFuture<Void> startAsync()
+    {
+        return setDesiredState(State.ACTIVE);
     }
 
-    public final void start() { setDesiredState(State.ACTIVE); }
 
     protected void deleted()
     {
@@ -1629,19 +1864,49 @@ public abstract class AbstractConfigured
         _taskExecutor.run(task);
     }
 
+    @Override
+    public void setAttributes(Map<String, Object> attributes) throws IllegalStateException, AccessControlException, IllegalArgumentException
+    {
+        doSync(setAttributesAsync(attributes));
+    }
 
     @Override
-    public void setAttributes(final Map<String, Object> attributes) throws IllegalStateException, AccessControlException, IllegalArgumentException
+    public ListenableFuture<Void> setAttributesAsync(final Map<String, Object> attributes) throws IllegalStateException, AccessControlException, IllegalArgumentException
     {
+        final Map<String,Object> updateAttributes = new HashMap<>(attributes);
+        Object desiredState = updateAttributes.remove(ConfiguredObject.DESIRED_STATE);
         runTask(new VoidTask()
         {
             @Override
             public void execute()
             {
                 authoriseSetAttributes(createProxyForValidation(attributes), attributes.keySet());
-                changeAttributes(attributes);
+                validateChange(createProxyForValidation(attributes), attributes.keySet());
+
+                changeAttributes(updateAttributes);
             }
         });
+        if(desiredState != null)
+        {
+            State state;
+            if(desiredState instanceof State)
+            {
+                state = (State)desiredState;
+            }
+            else if(desiredState instanceof String)
+            {
+                state = State.valueOf((String)desiredState);
+            }
+            else
+            {
+                throw new IllegalArgumentException("Cannot convert an object of type " + desiredState.getClass().getName() + " to a State");
+            }
+            return setDesiredState(state);
+        }
+        else
+        {
+            return Futures.immediateFuture(null);
+        }
     }
 
     protected void authoriseSetAttributes(final ConfiguredObject<?> proxyForValidation,
@@ -1652,7 +1917,6 @@ public abstract class AbstractConfigured
 
     protected void changeAttributes(final Map<String, Object> attributes)
     {
-        validateChange(createProxyForValidation(attributes), attributes.keySet());
         Collection<String> names = getAttributeNames();
         for (String name : names)
         {
@@ -2193,7 +2457,8 @@ public abstract class AbstractConfigured
             {
                 if (source.getState() != State.DELETED)
                 {
-                    source.delete();
+                    // TODO - RG - This isn't right :-(
+                    source.deleteAsync();
                 }
             }
             finally

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObjectTypeFactory.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObjectTypeFactory.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObjectTypeFactory.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObjectTypeFactory.java Mon Mar  9 17:12:14 2015
@@ -23,6 +23,10 @@ package org.apache.qpid.server.model;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.SettableFuture;
+
 import org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
 import org.apache.qpid.server.store.ConfiguredObjectDependency;
 import org.apache.qpid.server.store.ConfiguredObjectRecord;
@@ -59,6 +63,26 @@ abstract public class AbstractConfigured
         return instance;
     }
 
+
+    @Override
+    public ListenableFuture<X> createAsync(final ConfiguredObjectFactory factory,
+                    final Map<String, Object> attributes,
+                    final ConfiguredObject<?>... parents)
+    {
+        final SettableFuture<X> returnVal = SettableFuture.create();
+        final X instance = createInstance(attributes, parents);
+        final ListenableFuture<Void> createFuture = instance.createAsync();
+        createFuture.addListener(new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                returnVal.set(instance);
+            }
+        }, MoreExecutors.sameThreadExecutor());
+        return returnVal;
+    }
+
     protected abstract X createInstance(Map<String, Object> attributes, ConfiguredObject<?>... parents);
 
     public final <C extends ConfiguredObject<?>> C getParent(Class<C> parentClass, ConfiguredObject<?>... parents)

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java Mon Mar  9 17:12:14 2015
@@ -31,6 +31,9 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
 import org.apache.qpid.common.QpidProperties;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.store.ManagementModeStoreHandler;
@@ -194,11 +197,11 @@ public abstract class AbstractSystemConf
     }
 
     @StateTransition(currentState = State.UNINITIALIZED, desiredState = State.ACTIVE)
-    protected void activate()
+    protected ListenableFuture<Void> activate()
     {
         final EventLogger eventLogger = _eventLogger;
 
-        EventLogger startupLogger;
+        final EventLogger startupLogger;
         if (isStartupLoggedToSystemOut())
         {
             //Create the composite (logging+SystemOut MessageLogger to be used during startup
@@ -232,17 +235,34 @@ public abstract class AbstractSystemConf
         BrokerStoreUpgraderAndRecoverer upgrader = new BrokerStoreUpgraderAndRecoverer(this);
         upgrader.perform();
 
-        Broker broker = getBroker();
+        final Broker broker = getBroker();
 
         broker.setEventLogger(startupLogger);
-        broker.open();
-
-        if (broker.getState() == State.ACTIVE)
-        {
-            startupLogger.message(BrokerMessages.READY());
-            broker.setEventLogger(eventLogger);
-        }
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+        broker.openAsync().addListener(
+                new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        try
+                        {
+
+                            if (broker.getState() == State.ACTIVE)
+                            {
+                                startupLogger.message(BrokerMessages.READY());
+                                broker.setEventLogger(eventLogger);
+                            }
+                        }
+                        finally
+                        {
+                            returnVal.set(null);
+                        }
+                    }
+                }, getTaskExecutor().getExecutor()
+                                      );
 
+        return returnVal;
     }
 
     @Override

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java Mon Mar  9 17:12:14 2015
@@ -45,5 +45,4 @@ public interface Binding<X extends Bindi
     @ManagedStatistic
     long getMatches();
 
-    void delete();
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java Mon Mar  9 17:12:14 2015
@@ -238,6 +238,8 @@ public interface ConfiguredObject<X exte
                                                ConfiguredObject... otherParents);
 
     void setAttributes(Map<String, Object> attributes) throws IllegalStateException, AccessControlException, IllegalArgumentException;
+    ListenableFuture<Void> setAttributesAsync(Map<String, Object> attributes) throws IllegalStateException, AccessControlException, IllegalArgumentException;
+
 
     Class<? extends ConfiguredObject> getCategoryClass();
     Class<? extends ConfiguredObject> getTypeClass();
@@ -250,8 +252,12 @@ public interface ConfiguredObject<X exte
     ConfiguredObjectRecord asObjectRecord();
 
     void open();
+    ListenableFuture<Void> openAsync();
+
+    void close();
+    ListenableFuture<Void> closeAsync();
 
-    ListenableFuture<Void> close();
+    ListenableFuture<Void> deleteAsync();
 
     TaskExecutor getTaskExecutor();
 

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java Mon Mar  9 17:12:14 2015
@@ -23,6 +23,8 @@ package org.apache.qpid.server.model;
 import java.util.Collection;
 import java.util.Map;
 
+import com.google.common.util.concurrent.ListenableFuture;
+
 import org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
 import org.apache.qpid.server.store.ConfiguredObjectRecord;
 import org.apache.qpid.server.store.UnresolvedConfiguredObject;
@@ -34,6 +36,8 @@ public interface ConfiguredObjectFactory
 
     <X extends ConfiguredObject<X>> X create(Class<X> clazz, Map<String, Object> attributes, ConfiguredObject<?>... parents);
 
+    <X extends ConfiguredObject<X>> ListenableFuture<X> createAsync(Class<X> clazz, Map<String, Object> attributes, ConfiguredObject<?>... parents);
+
 
 
     <X extends ConfiguredObject<X>> ConfiguredObjectTypeFactory<X> getConfiguredObjectTypeFactory(Class<X> categoryClass,

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java Mon Mar  9 17:12:14 2015
@@ -26,6 +26,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.util.concurrent.ListenableFuture;
+
 import org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
 import org.apache.qpid.server.plugin.QpidServiceLoader;
 import org.apache.qpid.server.store.ConfiguredObjectRecord;
@@ -112,6 +114,18 @@ public class ConfiguredObjectFactoryImpl
         return factory.create(this, attributes, parents);
     }
 
+
+    @Override
+    public <X extends ConfiguredObject<X>> ListenableFuture<X> createAsync(Class<X> clazz,
+                                                    final Map<String, Object> attributes,
+                                                    final ConfiguredObject<?>... parents)
+    {
+        ConfiguredObjectTypeFactory<X> factory = getConfiguredObjectTypeFactory(clazz, attributes);
+
+        return factory.createAsync(this, attributes, parents);
+    }
+
+
     @Override
     public <X extends ConfiguredObject<X>> ConfiguredObjectTypeFactory<X> getConfiguredObjectTypeFactory(final Class<X> categoryClass,
                                                                                                          Map<String, Object> attributes)

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java Mon Mar  9 17:12:14 2015
@@ -40,6 +40,7 @@ import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
 
+import com.google.common.util.concurrent.ListenableFuture;
 import org.apache.log4j.Logger;
 
 import org.apache.qpid.server.plugin.ConfiguredObjectRegistration;
@@ -801,20 +802,37 @@ public class ConfiguredObjectTypeRegistr
         {
             if(m.isAnnotationPresent(StateTransition.class))
             {
-                if(m.getParameterTypes().length == 0)
+                if(ListenableFuture.class.isAssignableFrom(m.getReturnType()))
                 {
-                    m.setAccessible(true);
-                    StateTransition annotation = m.getAnnotation(StateTransition.class);
+                    if (m.getParameterTypes().length == 0)
+                    {
+                        m.setAccessible(true);
+                        StateTransition annotation = m.getAnnotation(StateTransition.class);
+
+                        for (State state : annotation.currentState())
+                        {
+                            addStateTransition(state, annotation.desiredState(), m, map);
+                        }
 
-                    for(State state : annotation.currentState())
+                    }
+                    else
                     {
-                        addStateTransition(state, annotation.desiredState(), m, map);
+                        throw new ServerScopedRuntimeException(
+                                "A state transition method must have no arguments. Method "
+                                + m.getName()
+                                + " on "
+                                + clazz.getName()
+                                + " does not meet this criteria.");
                     }
-
                 }
                 else
                 {
-                    throw new ServerScopedRuntimeException("A state transition method must have no arguments. Method " + m.getName() + " on " + clazz.getName() + " does not meet this criteria.");
+                    throw new ServerScopedRuntimeException(
+                            "A state transition method must return a ListenableFuture. Method "
+                            + m.getName()
+                            + " on "
+                            + clazz.getName()
+                            + " does not meet this criteria.");
                 }
             }
         }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java Mon Mar  9 17:12:14 2015
@@ -103,7 +103,6 @@ public interface Connection<X extends Co
     //children
     Collection<Session> getSessions();
 
-    void delete();
 
 
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java Mon Mar  9 17:12:14 2015
@@ -23,6 +23,8 @@ package org.apache.qpid.server.model;
 import java.util.Collection;
 import java.util.Set;
 
+import com.google.common.util.concurrent.ListenableFuture;
+
 @ManagedObject
 public interface Port<X extends Port<X>> extends ConfiguredObject<X>
 {
@@ -76,4 +78,6 @@ public interface Port<X extends Port<X>>
 
     void start();
 
+    ListenableFuture<Void> startAsync();
+
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java Mon Mar  9 17:12:14 2015
@@ -147,8 +147,6 @@ public interface VirtualHost<X extends V
 
     void stop();
 
-    void delete();
-
     String getRedirectHost(AmqpPort<?> port);
 
     public static interface Transaction

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java Mon Mar  9 17:12:14 2015
@@ -35,6 +35,9 @@ import java.util.regex.Pattern;
 
 import javax.security.auth.Subject;
 
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
 import org.apache.log4j.Logger;
 
 import org.apache.qpid.common.QpidProperties;
@@ -235,13 +238,40 @@ public class BrokerAdapter extends Abstr
     }
 
     @StateTransition( currentState = State.UNINITIALIZED, desiredState = State.ACTIVE )
-    private void activate()
+    private ListenableFuture<Void> activate()
     {
         if(_parent.isManagementMode())
         {
-            _managementModeAuthenticationProvider.open();
+            final SettableFuture<Void> returnVal = SettableFuture.create();
+
+            _managementModeAuthenticationProvider.openAsync().addListener(
+                    new Runnable()
+                    {
+                        @Override
+                        public void run()
+                        {
+                            try
+                            {
+                                activateWithoutManagementMode();
+                            }
+                            finally
+                            {
+                                returnVal.set(null);
+                            }
+                        }
+                    }, getTaskExecutor().getExecutor()
+                                                                         );
+            return returnVal;
+        }
+        else
+        {
+            activateWithoutManagementMode();
+            return Futures.immediateFuture(null);
         }
+    }
 
+    private void activateWithoutManagementMode()
+    {
         boolean hasBrokerAnyErroredChildren = false;
 
         for (final Class<? extends ConfiguredObject> childClass : getModel().getChildTypes(getCategoryClass()))

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java?rev=1665306&r1=1665305&r2=1665306&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java Mon Mar  9 17:12:14 2015
@@ -160,11 +160,28 @@ public final class ConnectionAdapter ext
     }
 
     @StateTransition( currentState = State.ACTIVE, desiredState = State.DELETED)
-    private void doDelete()
+    private ListenableFuture<Void> doDelete()
     {
-        asyncClose();
-        deleted();
-        setState(State.DELETED);
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+        asyncClose().addListener(
+                new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        try
+                        {
+                            deleted();
+                            setState(State.DELETED);
+                        }
+                        finally
+                        {
+                            returnVal.set(null);
+                        }
+                    }
+                }, getTaskExecutor().getExecutor()
+                                );
+        return returnVal;
     }
 
     @Override



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org