[jboss-cvs] JBoss Messaging SVN: r5884 - in trunk: src/main/org/jboss/messaging/core/client/impl and 22 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Feb 17 14:52:52 EST 2009


Author: timfox
Date: 2009-02-17 14:52:51 -0500 (Tue, 17 Feb 2009)
New Revision: 5884

Added:
   trunk/src/main/org/jboss/messaging/core/server/cluster/impl/Redistributor.java
   trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/MessageRedistributionTest.java
Modified:
   trunk/.classpath
   trunk/src/main/org/jboss/messaging/core/client/impl/ClientSessionImpl.java
   trunk/src/main/org/jboss/messaging/core/client/impl/ConnectionManagerImpl.java
   trunk/src/main/org/jboss/messaging/core/deployers/impl/AddressSettingsDeployer.java
   trunk/src/main/org/jboss/messaging/core/management/impl/ManagementServiceImpl.java
   trunk/src/main/org/jboss/messaging/core/management/impl/QueueControl.java
   trunk/src/main/org/jboss/messaging/core/postoffice/Bindings.java
   trunk/src/main/org/jboss/messaging/core/postoffice/PostOffice.java
   trunk/src/main/org/jboss/messaging/core/postoffice/impl/BindingsImpl.java
   trunk/src/main/org/jboss/messaging/core/postoffice/impl/LocalQueueBinding.java
   trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/RemotingConnectionImpl.java
   trunk/src/main/org/jboss/messaging/core/security/impl/SecurityStoreImpl.java
   trunk/src/main/org/jboss/messaging/core/server/Queue.java
   trunk/src/main/org/jboss/messaging/core/server/cluster/ClusterManager.java
   trunk/src/main/org/jboss/messaging/core/server/cluster/impl/BridgeImpl.java
   trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterConnectionImpl.java
   trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterManagerImpl.java
   trunk/src/main/org/jboss/messaging/core/server/impl/MessagingServerImpl.java
   trunk/src/main/org/jboss/messaging/core/server/impl/QueueFactoryImpl.java
   trunk/src/main/org/jboss/messaging/core/server/impl/QueueImpl.java
   trunk/src/main/org/jboss/messaging/core/server/impl/ServerConsumerImpl.java
   trunk/src/main/org/jboss/messaging/core/server/impl/ServerSessionImpl.java
   trunk/src/main/org/jboss/messaging/core/settings/impl/AddressSettings.java
   trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/ClusterTestBase.java
   trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OneWayChainClusterTest.java
   trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OnewayTwoNodeClusterTest.java
   trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/SymmetricClusterTest.java
   trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/MultiThreadRandomFailoverTestBase.java
   trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/RandomFailoverTest.java
   trunk/tests/src/org/jboss/messaging/tests/integration/paging/PageCrashTest.java
   trunk/tests/src/org/jboss/messaging/tests/performance/persistence/FakePostOffice.java
   trunk/tests/src/org/jboss/messaging/tests/stress/failover/LargeMessageMultiThreadFailoverStressTest.java
   trunk/tests/src/org/jboss/messaging/tests/stress/failover/MultiThreadRandomFailoverStressTest.java
   trunk/tests/src/org/jboss/messaging/tests/stress/failover/RandomFailoverStressTest.java
   trunk/tests/src/org/jboss/messaging/tests/timing/core/server/impl/QueueImplTest.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/deployers/impl/AddressSettingsDeployerTest.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/journal/impl/JournalImplTestUnit.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/management/impl/QueueControlTest.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueFactoryImplTest.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueImplTest.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/settings/impl/AddressSettingsTest.java
Log:
Redistribution fixes etc


Modified: trunk/.classpath
===================================================================
--- trunk/.classpath	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/.classpath	2009-02-17 19:52:51 UTC (rev 5884)
@@ -64,6 +64,6 @@
 	<classpathentry kind="lib" path="thirdparty/netty/lib/netty-3.1.0.ALPHA2.jar" sourcepath="thirdparty/netty/lib/netty-3.1.0.ALPHA2-sources.jar"/>
 	<classpathentry kind="lib" path="thirdparty/apache-mina/lib/mina-core-2.0.0-M4.jar"/>
 	<classpathentry kind="lib" path="thirdparty/slf4j/log4j/lib/slf4j-log4j12-1.5.2.jar"/>
-	<classpathentry kind="lib" path="thirdparty/slf4j/api/lib/slf4j-api-1.5.2.jar"/>
+	<classpathentry kind="lib" path="thirdparty/slf4j/api/lib/slf4j-api-1.4.3.jar"/>
 	<classpathentry kind="output" path="eclipse-output"/>
 </classpath>

Modified: trunk/src/main/org/jboss/messaging/core/client/impl/ClientSessionImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/client/impl/ClientSessionImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/client/impl/ClientSessionImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -175,6 +175,8 @@
    private volatile boolean started;
 
    private SendAcknowledgementHandler sendAckHandler;
+   
+   private volatile boolean inClose;
 
    // Constructors ----------------------------------------------------------------------------
 
@@ -747,7 +749,7 @@
          consumer.handleLargeMessageContinuation(continuation);
       }
    }
-
+   
    public void close() throws MessagingException
    {
       if (closed)
@@ -759,12 +761,18 @@
       {
          closeChildren();
 
-         channel.sendBlocking(new SessionCloseMessage());                  
+         inClose = true;
+         
+         channel.sendBlocking(new SessionCloseMessage());   
       }
       catch (Throwable ignore)
       {
          // Session close should always return without exception
       }
+      finally
+      {
+         inClose = false;
+      }
       
       doCleanup();
    }
@@ -823,10 +831,24 @@
             ok = true;
          }
          else
-         {
-            // There may be a close session call blocking - the response will never come because the session has been
-            // closed on the server so we need to interrupt it
-            channel.returnBlocking();
+         {                        
+            if (inClose)
+            {            
+               // a session re-attach may fail, if the session close was sent before failover started, hit the server,
+               // processed, then before the response was received back, failover occurred, re-attach was attempted. in
+               // this case it's ok - we don't want to call any failure listeners and we don't want to halt the rest of
+               // the failover process.
+               //
+               // however if session re-attach fails and the session was not in a call to close, then we DO want to call
+               // the session listeners so we return false
+               ok = true;
+            }
+            else
+            {
+               log.warn("Session not found on server when attempting to re-attach");
+            }
+            
+            channel.returnBlocking();            
          }
       }
       catch (Throwable t)

Modified: trunk/src/main/org/jboss/messaging/core/client/impl/ConnectionManagerImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/client/impl/ConnectionManagerImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/client/impl/ConnectionManagerImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -511,7 +511,7 @@
                // Forcing return all channels won't guarantee that any blocked thread will return immediately
                // So we need to wait for it
                forceReturnAllChannel1s();
-
+               
                // Now we need to make sure that the thread has actually exited and returned it's connections
                // before failover occurs
 
@@ -608,6 +608,7 @@
       
       Map<RemotingConnection, List<ClientSessionInternal>> sessionsPerConnection = new HashMap<RemotingConnection, List<ClientSessionInternal>>();
 
+      
       for (Map.Entry<ClientSessionInternal, RemotingConnection> entry : sessions.entrySet())
       {
          ClientSessionInternal session = entry.getKey();
@@ -674,11 +675,13 @@
          // If all connections got ok, then handle failover
          for (Map.Entry<ClientSessionInternal, RemotingConnection> entry : sessions.entrySet())
          {
-            ok = entry.getKey().handleFailover(entry.getValue());
-
-            if (!ok)
+            boolean b = entry.getKey().handleFailover(entry.getValue());
+            
+            if (!b)
             {
-               break;
+               //If a session fails to re-attach we doom the lot, but we make sure we try all sessions and don't exit early
+               //or connections might be left lying around
+               ok = false;
             }
          }
       }

Modified: trunk/src/main/org/jboss/messaging/core/deployers/impl/AddressSettingsDeployer.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/deployers/impl/AddressSettingsDeployer.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/deployers/impl/AddressSettingsDeployer.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -18,7 +18,7 @@
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */ 
+ */
 
 package org.jboss.messaging.core.deployers.impl;
 
@@ -35,42 +35,41 @@
  * @author <a href="ataylor at redhat.com">Andy Taylor</a>
  */
 public class AddressSettingsDeployer extends XmlDeployer
-{   
-   private static final String CLUSTERED_NODE_NAME = "clustered";
-   
+{
    private static final String DEAD_LETTER_ADDRESS_NODE_NAME = "dead-letter-address";
-   
+
    private static final String EXPIRY_ADDRESS_NODE_NAME = "expiry-address";
-   
+
    private static final String REDELIVERY_DELAY_NODE_NAME = "redelivery-delay";
-   
+
    private static final String MAX_SIZE_BYTES_NODE_NAME = "max-size-bytes";
-   
+
    private static final String DROP_MESSAGES_WHEN_FULL_NODE_NAME = "drop-messages-when-full";
-   
+
    private static final String PAGE_SIZE_BYTES_NODE_NAME = "page-size-bytes";
-   
+
    private static final String DISTRIBUTION_POLICY_CLASS_NODE_NAME = "distribution-policy-class";
-   
+
    private static final String MESSAGE_COUNTER_HISTORY_DAY_LIMIT_NODE_NAME = "message-counter-history-day-limit";
 
    private static final String SOLO_MESSAGE_NODE_NAME = "solo-queue";
 
    private final HierarchicalRepository<AddressSettings> addressSettingsRepository;
 
-   public AddressSettingsDeployer(final DeploymentManager deploymentManager, final HierarchicalRepository<AddressSettings> addressSettingsRepository)
+   public AddressSettingsDeployer(final DeploymentManager deploymentManager,
+                                  final HierarchicalRepository<AddressSettings> addressSettingsRepository)
    {
-   	super(deploymentManager);
+      super(deploymentManager);
       this.addressSettingsRepository = addressSettingsRepository;
    }
-   
+
    /**
     * the names of the elements to deploy
     * @return the names of the elements todeploy
     */
    public String[] getElementTagName()
    {
-      return new String[]{"address-settings"};
+      return new String[] { "address-settings" };
    }
 
    @Override
@@ -79,9 +78,10 @@
       if ("deployment".equals(rootNode.getNodeName()))
       {
          XMLUtil.validate(rootNode, "jbm-configuration.xsd");
-      } else 
+      }
+      else
       {
-         XMLUtil.validate(rootNode, "jbm-queues.xsd");         
+         XMLUtil.validate(rootNode, "jbm-queues.xsd");
       }
    }
 
@@ -93,27 +93,23 @@
    public void deploy(Node node) throws Exception
    {
       String match = node.getAttributes().getNamedItem(getKeyAttribute()).getNodeValue();
-      
+
       NodeList children = node.getChildNodes();
-      
+
       AddressSettings addressSettings = new AddressSettings();
-      
+
       for (int i = 0; i < children.getLength(); i++)
       {
          Node child = children.item(i);
-         
-         if (CLUSTERED_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+
+         if (DEAD_LETTER_ADDRESS_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
          {
-            addressSettings.setClustered(Boolean.valueOf(child.getTextContent()));
-         }
-         else if (DEAD_LETTER_ADDRESS_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
             SimpleString queueName = new SimpleString(child.getTextContent());
             addressSettings.setDeadLetterAddress(queueName);
          }
          else if (EXPIRY_ADDRESS_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
          {
-         	SimpleString queueName = new SimpleString(child.getTextContent());
+            SimpleString queueName = new SimpleString(child.getTextContent());
             addressSettings.setExpiryAddress(queueName);
          }
          else if (REDELIVERY_DELAY_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
@@ -145,13 +141,13 @@
             addressSettings.setSoloQueue(Boolean.valueOf(child.getTextContent().trim()));
          }
       }
-      
+
       addressSettingsRepository.addMatch(match, addressSettings);
    }
 
    public String[] getConfigFileNames()
    {
-      return new String[] {"jbm-configuration", "jbm-queues.xml"};
+      return new String[] { "jbm-configuration", "jbm-queues.xml" };
    }
 
    /**
@@ -162,7 +158,7 @@
    public void undeploy(Node node) throws Exception
    {
       String match = node.getAttributes().getNamedItem(getKeyAttribute()).getNodeValue();
-      
+
       addressSettingsRepository.removeMatch(match);
    }
 

Modified: trunk/src/main/org/jboss/messaging/core/management/impl/ManagementServiceImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/management/impl/ManagementServiceImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/management/impl/ManagementServiceImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -240,7 +240,7 @@
                                                   messageCounterManager.getMaxDayCount());
       messageCounterManager.registerMessageCounter(queue.getName().toString(), counter);
       ObjectName objectName = ObjectNames.getQueueObjectName(address, queue.getName());
-      QueueControl queueControl = new QueueControl(queue, storageManager, postOffice, addressSettingsRepository, counter);
+      QueueControl queueControl = new QueueControl(queue, postOffice, addressSettingsRepository, counter);
       registerInJMX(objectName, new ReplicationAwareQueueControlWrapper(objectName,
                                                                         queueControl,
                                                                         managementClusterPassword,

Modified: trunk/src/main/org/jboss/messaging/core/management/impl/QueueControl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/management/impl/QueueControl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/management/impl/QueueControl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -39,7 +39,6 @@
 import org.jboss.messaging.core.messagecounter.MessageCounter;
 import org.jboss.messaging.core.messagecounter.MessageCounter.DayCounter;
 import org.jboss.messaging.core.messagecounter.impl.MessageCounterHelper;
-import org.jboss.messaging.core.persistence.StorageManager;
 import org.jboss.messaging.core.postoffice.Binding;
 import org.jboss.messaging.core.postoffice.PostOffice;
 import org.jboss.messaging.core.server.MessageReference;
@@ -64,8 +63,6 @@
 
    private final Queue queue;
 
-   private final StorageManager storageManager;
-
    private final PostOffice postOffice;
 
    private final HierarchicalRepository<AddressSettings> addressSettingsRepository;
@@ -77,13 +74,11 @@
    // Constructors --------------------------------------------------
 
    public QueueControl(final Queue queue,
-                       final StorageManager storageManager,
                        final PostOffice postOffice,
                        final HierarchicalRepository<AddressSettings> addressSettingsRepository,
                        final MessageCounter counter)
    {
       this.queue = queue;
-      this.storageManager = storageManager;
       this.postOffice = postOffice;
       this.addressSettingsRepository = addressSettingsRepository;
       this.counter = counter;

Modified: trunk/src/main/org/jboss/messaging/core/postoffice/Bindings.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/postoffice/Bindings.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/postoffice/Bindings.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -26,6 +26,7 @@
 
 import org.jboss.messaging.core.server.ServerMessage;
 import org.jboss.messaging.core.transaction.Transaction;
+import org.jboss.messaging.util.SimpleString;
 
 /**
  * A Bindings
@@ -39,12 +40,14 @@
 public interface Bindings
 {
    Collection<Binding> getBindings();
-   
+
    void route(ServerMessage message, Transaction tx) throws Exception;
-   
+
    void addBinding(Binding binding);
-   
+
    void removeBinding(Binding binding);
-   
+
    void setRouteWhenNoConsumers(boolean takePriorityIntoAccount);
+
+   boolean redistribute(ServerMessage message, SimpleString routingName, Transaction tx) throws Exception;
 }

Modified: trunk/src/main/org/jboss/messaging/core/postoffice/PostOffice.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/postoffice/PostOffice.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/postoffice/PostOffice.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -70,6 +70,8 @@
    void route(ServerMessage message) throws Exception;
    
    void route(ServerMessage message, Transaction tx) throws Exception;
+   
+   boolean redistribute(ServerMessage message, SimpleString routingName, Transaction tx) throws Exception;
 
    Set<SimpleString> listAllDestinations();
 

Modified: trunk/src/main/org/jboss/messaging/core/postoffice/impl/BindingsImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/postoffice/impl/BindingsImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/postoffice/impl/BindingsImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -133,8 +133,6 @@
 
    private void routeFromCluster(final ServerMessage message, final Transaction tx) throws Exception
    {
-     // log.info(System.identityHashCode(this) + " routing from cluster");
-
       byte[] ids = (byte[])message.getProperty(MessageImpl.HDR_ROUTE_TO_IDS);
       
       ByteBuffer buff = ByteBuffer.wrap(ids);
@@ -158,8 +156,6 @@
          binding.willRoute(message);
          
          chosen.add(binding.getBindable());
-         
-        // log.info("routing to " + binding.getType() + " : " + binding.getRoutingName());
       }
       
       for (Bindable bindable : chosen)
@@ -172,11 +168,95 @@
          bindable.route(message, tx);
       }
    }
+   
+   public boolean redistribute(final ServerMessage message, final SimpleString routingName, final Transaction tx) throws Exception
+   {
+      if (routeWhenNoConsumers)
+      {
+         return false;
+      }
+      
+      List<Binding> bindings = routingNameBindingMap.get(routingName);
 
+      if (bindings == null)
+      {
+         // The value can become null if it's concurrently removed while we're iterating - this is expected
+         // ConcurrentHashMap behaviour!
+         return false;
+      }
+
+      Integer ipos = routingNamePositions.get(routingName);
+
+      int pos = ipos != null ? ipos.intValue() : 0;
+
+      int length = bindings.size();
+
+      int startPos = pos;
+
+      Binding theBinding = null;
+
+      //TODO - combine this with similar logic in route()
+      while (true)
+      {
+         Binding binding;
+         try
+         {
+            binding = bindings.get(pos);
+         }
+         catch (IndexOutOfBoundsException e)
+         {
+            // This can occur if binding is removed while in route
+            if (!bindings.isEmpty())
+            {
+               pos = 0;
+
+               continue;
+            }
+            else
+            {
+               break;
+            }
+         }
+         
+         pos = incrementPos(pos, length);
+
+         Filter filter = binding.getFilter();
+                                            
+         boolean highPrior = binding.isHighAcceptPriority(message);
+         
+         if (highPrior && (filter == null || filter.match(message)))
+         {                     
+            theBinding = binding;
+
+            break;            
+         }
+         
+         if (pos == startPos)
+         {            
+            break;
+         }
+      }
+      
+      routingNamePositions.put(routingName, pos);
+
+      if (theBinding != null)
+      {         
+         theBinding.willRoute(message);
+         
+         theBinding.getBindable().preroute(message, tx);
+         
+         theBinding.getBindable().route(message, tx);         
+         
+         return true;
+      }
+      else
+      {        
+         return false;
+      }
+   }
+
    public void route(final ServerMessage message, final Transaction tx) throws Exception
    {
-      //log.info(System.identityHashCode(this) + " routing " + message.getDestination());
-
       if (!exclusiveBindings.isEmpty())
       {
          for (Binding binding : exclusiveBindings)
@@ -303,8 +383,6 @@
                {
                   theBinding.willRoute(message);
                   
-                  //log.info("routing to " + theBinding.getType() + " : " + theBinding.getRoutingName());
-                  
                   chosen.add(theBinding.getBindable());
                }
 

Modified: trunk/src/main/org/jboss/messaging/core/postoffice/impl/LocalQueueBinding.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/postoffice/impl/LocalQueueBinding.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/postoffice/impl/LocalQueueBinding.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -23,7 +23,7 @@
 
 package org.jboss.messaging.core.postoffice.impl;
 
-import java.util.List;
+import java.util.Set;
 
 import org.jboss.messaging.core.filter.Filter;
 import org.jboss.messaging.core.logging.Logger;
@@ -33,6 +33,7 @@
 import org.jboss.messaging.core.server.Consumer;
 import org.jboss.messaging.core.server.Queue;
 import org.jboss.messaging.core.server.ServerMessage;
+import org.jboss.messaging.core.server.cluster.impl.Redistributor;
 import org.jboss.messaging.util.SimpleString;
 
 /**
@@ -132,10 +133,15 @@
    {
       //It's a high accept priority if the queue has at least one matching consumer
       
-      List<Consumer> consumers = queue.getConsumers();
+      Set<Consumer> consumers = queue.getConsumers();
       
       for (Consumer consumer: consumers)
       {
+         if (consumer instanceof Redistributor)
+         {
+            continue;
+         }
+         
          Filter filter = consumer.getFilter();
          
          if (filter == null)

Modified: trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -24,7 +24,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -63,14 +62,16 @@
 import org.jboss.messaging.core.server.QueueFactory;
 import org.jboss.messaging.core.server.SendLock;
 import org.jboss.messaging.core.server.ServerMessage;
-import org.jboss.messaging.core.server.cluster.RemoteQueueBinding;
 import org.jboss.messaging.core.server.impl.SendLockImpl;
 import org.jboss.messaging.core.server.impl.ServerMessageImpl;
+import org.jboss.messaging.core.settings.HierarchicalRepository;
+import org.jboss.messaging.core.settings.impl.AddressSettings;
 import org.jboss.messaging.core.transaction.Transaction;
 import org.jboss.messaging.core.transaction.TransactionOperation;
 import org.jboss.messaging.core.transaction.TransactionPropertyIndexes;
 import org.jboss.messaging.core.transaction.Transaction.State;
 import org.jboss.messaging.core.transaction.impl.TransactionImpl;
+import org.jboss.messaging.util.ExecutorFactory;
 import org.jboss.messaging.util.JBMThreadFactory;
 import org.jboss.messaging.util.SimpleString;
 import org.jboss.messaging.util.TypedProperties;
@@ -88,8 +89,6 @@
 
    public static final SimpleString HDR_RESET_QUEUE_DATA = new SimpleString("_JBM_RESET_QUEUE_DATA");
 
-   private static final List<MessageReference> emptyList = Collections.<MessageReference> emptyList();
-
    private final AddressManager addressManager;
 
    private final QueueFactory queueFactory;
@@ -134,6 +133,12 @@
 
    private final Object notificationLock = new Object();
 
+   private final ExecutorFactory redistributorExecutorFactory;
+
+   private final HierarchicalRepository<AddressSettings> addressSettingsRepository;
+   
+   private final String nodeID;
+
    public PostOfficeImpl(final StorageManager storageManager,
                          final PagingManager pagingManager,
                          final QueueFactory bindableFactory,
@@ -144,7 +149,11 @@
                          final boolean enableWildCardRouting,
                          final boolean backup,
                          final int idCacheSize,
-                         final boolean persistIDCache)
+                         final boolean persistIDCache,
+                         final ExecutorFactory orderedExecutorFactory,           
+                         HierarchicalRepository<AddressSettings> addressSettingsRepository,
+                         final String nodeID)
+
    {
       this.storageManager = storageManager;
 
@@ -174,6 +183,13 @@
       this.idCacheSize = idCacheSize;
 
       this.persistIDCache = persistIDCache;
+
+      this.redistributorExecutorFactory = orderedExecutorFactory;
+
+      this.addressSettingsRepository = addressSettingsRepository;
+      
+      this.nodeID = nodeID;
+      
    }
 
    // MessagingComponent implementation ---------------------------------------
@@ -239,57 +255,57 @@
       synchronized (notificationLock)
       {
          NotificationType type = notification.getType();
-         
+
          switch (type.toInt())
          {
             case NotificationType.BINDING_ADDED_INDEX:
             {
                TypedProperties props = notification.getProperties();
-   
+
                Integer bindingType = (Integer)props.getProperty(ManagementHelper.HDR_BINDING_TYPE);
-   
+
                if (bindingType == null)
                {
                   throw new IllegalArgumentException("Binding type not specified");
                }
-               
+
                if (bindingType == BindingType.DIVERT_INDEX)
                {
                   // We don't propagate diverts
                   return;
                }
-   
+
                SimpleString routingName = (SimpleString)props.getProperty(ManagementHelper.HDR_ROUTING_NAME);
-   
+
                SimpleString clusterName = (SimpleString)props.getProperty(ManagementHelper.HDR_CLUSTER_NAME);
-   
+
                SimpleString address = (SimpleString)props.getProperty(ManagementHelper.HDR_ADDRESS);
-   
+
                Integer transientID = (Integer)props.getProperty(ManagementHelper.HDR_BINDING_ID);
-   
+
                SimpleString filterString = (SimpleString)props.getProperty(ManagementHelper.HDR_FILTERSTRING);
-               
+
                Integer distance = (Integer)props.getProperty(ManagementHelper.HDR_DISTANCE);
-   
+
                QueueInfo info = new QueueInfo(routingName, clusterName, address, filterString, transientID, distance);
-   
+
                queueInfos.put(clusterName, info);
                
                break;
-            }            
+            }
             case NotificationType.BINDING_REMOVED_INDEX:
             {
                TypedProperties props = notification.getProperties();
-   
+
                SimpleString clusterName = (SimpleString)props.getProperty(ManagementHelper.HDR_CLUSTER_NAME);
-   
+
                if (clusterName == null)
                {
                   throw new IllegalStateException("No cluster name");
                }
-   
+
                QueueInfo info = queueInfos.remove(clusterName);
-   
+
                if (info == null)
                {
                   throw new IllegalStateException("Cannot find queue info for queue " + clusterName);
@@ -298,99 +314,155 @@
                break;
             }
             case NotificationType.CONSUMER_CREATED_INDEX:
-            { 
+            {
                TypedProperties props = notification.getProperties();
-   
+
                SimpleString clusterName = (SimpleString)props.getProperty(ManagementHelper.HDR_CLUSTER_NAME);
-   
+
                if (clusterName == null)
                {
                   throw new IllegalStateException("No cluster name");
                }
-                                 
+
                SimpleString filterString = (SimpleString)props.getProperty(ManagementHelper.HDR_FILTERSTRING);
-   
+
                QueueInfo info = queueInfos.get(clusterName);
-   
+
                if (info == null)
                {
                   throw new IllegalStateException("Cannot find queue info for queue " + clusterName);
                }
-      
+
                info.incrementConsumers();
-   
+
                if (filterString != null)
                {
                   List<SimpleString> filterStrings = info.getFilterStrings();
-   
+
                   if (filterStrings == null)
                   {
                      filterStrings = new ArrayList<SimpleString>();
-   
+
                      info.setFilterStrings(filterStrings);
                   }
+                  
+                  filterStrings.add(filterString);
                }
-                              
+
+               Integer distance = (Integer)props.getProperty(ManagementHelper.HDR_DISTANCE);
+
+               if (distance == null)
+               {
+                  throw new IllegalStateException("No distance");
+               }
+
+               if (distance > 0)
+               {
+                  SimpleString queueName = (SimpleString)props.getProperty(ManagementHelper.HDR_ROUTING_NAME);
+
+                  if (queueName == null)
+                  {
+                     throw new IllegalStateException("No queue name");
+                  }
+
+                  Binding binding = getBinding(queueName);
+
+                  if (binding != null)
+                  {
+                     // We have a local queue
+                     Queue queue = (Queue)binding.getBindable();
+                     
+                     AddressSettings addressSettings = addressSettingsRepository.getMatch(binding.getAddress()
+                                                                                        .toString());
+
+                     long redistributionDelay = addressSettings.getRedistributionDelay();
+                     
+                     if (redistributionDelay != -1)
+                     {                     
+                        queue.addRedistributor(redistributionDelay, redistributorExecutorFactory.getExecutor());
+                     }                                 
+                  }
+               }
+               
                break;
             }
             case NotificationType.CONSUMER_CLOSED_INDEX:
-            {   
+            {
                TypedProperties props = notification.getProperties();
-   
+
                SimpleString clusterName = (SimpleString)props.getProperty(ManagementHelper.HDR_CLUSTER_NAME);
-   
+
                if (clusterName == null)
                {
-                  throw new IllegalStateException("No cluster name");
+                  throw new IllegalStateException("No distance");
                }
-   
+
                SimpleString filterString = (SimpleString)props.getProperty(ManagementHelper.HDR_FILTERSTRING);
-   
+               
                QueueInfo info = queueInfos.get(clusterName);
-   
+
                if (info == null)
                {
                   throw new IllegalStateException("Cannot find queue info for queue " + clusterName);
                }
 
                info.decrementConsumers();
-   
+
                if (filterString != null)
                {
                   List<SimpleString> filterStrings = info.getFilterStrings();
-                     
+
                   filterStrings.remove(filterString);
                }
+
+               if (info.getNumberOfConsumers() == 0)
+               {
+                  Integer distance = (Integer)props.getProperty(ManagementHelper.HDR_DISTANCE);
+
+                  if (distance == null)
+                  {
+                     throw new IllegalStateException("No cluster name");
+                  }
+
+                  if (distance == 0)
+                  {
+                     SimpleString queueName = (SimpleString)props.getProperty(ManagementHelper.HDR_ROUTING_NAME);
+
+                     if (queueName == null)
+                     {
+                        throw new IllegalStateException("No queue name");
+                     }
+
+                     Binding binding = getBinding(queueName);
+
+                     if (binding == null)
+                     {
+                        throw new IllegalStateException("No queue " + queueName);
+                     }
+
+                     Queue queue = (Queue)binding.getBindable();
+                     
+                     AddressSettings addressSettings = addressSettingsRepository.getMatch(binding.getAddress()
+                                                                                          .toString());
+
+                     long redistributionDelay = addressSettings.getRedistributionDelay();
+                     
+                     if (redistributionDelay != -1)
+                     {
+                        queue.addRedistributor(redistributionDelay, redistributorExecutorFactory.getExecutor());                     
+                     }                        
+                  }
+               }
+                 
                
-//               if (redistributeMessages)
-//               {                  
-//                  int distance = (Integer)props.getProperty(ManagementHelper.HDR_DISTANCE);
-//                  
-//                  if (distance == 0)
-//                  {
-//                     if (info.getNumberOfConsumers() == 0)
-//                     {
-//                        Bindings bindings = getBindingsForAddress(info.getAddress());
-//                        
-//                        Collection<Binding> theBindings = bindings.getBindings();
-//                        
-//                        for (Binding binding: theBindings)
-//                        {
-//                           if (binding.getFilter() != null && !binding.getFilter().match(message) ?????????????
-//                        }
-//                     }
-//                  }
-//               }
-               
-               
+            
                break;
             }
+            
          }
       }
    }
 
-   private boolean redistributeMessages;
-   
    // PostOffice implementation -----------------------------------------------
 
    public synchronized boolean addDestination(final SimpleString address, final boolean durable) throws Exception
@@ -464,7 +536,7 @@
       props.putIntProperty(ManagementHelper.HDR_DISTANCE, binding.getDistance());
 
       Filter filter = binding.getFilter();
-      
+
       if (filter != null)
       {
          props.putStringProperty(ManagementHelper.HDR_FILTERSTRING, filter.getFilterString());
@@ -517,7 +589,7 @@
    public void route(final ServerMessage message, Transaction tx) throws Exception
    {
       SimpleString address = message.getDestination();
-            
+
       if (checkAllowable)
       {
          if (!addressManager.containsDestination(address))
@@ -528,7 +600,7 @@
       }
 
       byte[] duplicateID = (byte[])message.getProperty(MessageImpl.HDR_DUPLICATE_DETECTION_ID);
-      
+
       DuplicateIDCache cache = null;
 
       if (duplicateID != null)
@@ -607,6 +679,20 @@
       route(message, null);
    }
 
+   public boolean redistribute(final ServerMessage message, final SimpleString routingName, final Transaction tx) throws Exception
+   {
+      Bindings bindings = addressManager.getBindings(message.getDestination());
+
+      if (bindings != null)
+      {
+         return bindings.redistribute(message, routingName, tx);
+      }
+      else
+      {
+         return false;
+      }
+   }
+
    public PagingManager getPagingManager()
    {
       return pagingManager;
@@ -704,7 +790,7 @@
             if (info.getAddress().startsWith(address))
             {
                message = createQueueInfoMessage(NotificationType.BINDING_ADDED, queueName);
-
+               
                message.putStringProperty(ManagementHelper.HDR_ADDRESS, info.getAddress());
                message.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, info.getClusterName());
                message.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, info.getRoutingName());
@@ -722,8 +808,9 @@
 
                   message.putStringProperty(ManagementHelper.HDR_ADDRESS, info.getAddress());
                   message.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, info.getClusterName());
+                  message.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, info.getRoutingName());
                   message.putIntProperty(ManagementHelper.HDR_DISTANCE, info.getDistance());
-
+                  
                   routeDirect(queue, message);
                }
 
@@ -735,9 +822,10 @@
 
                      message.putStringProperty(ManagementHelper.HDR_ADDRESS, info.getAddress());
                      message.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, info.getClusterName());
+                     message.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, info.getRoutingName());
                      message.putStringProperty(ManagementHelper.HDR_FILTERSTRING, filterString);
                      message.putIntProperty(ManagementHelper.HDR_DISTANCE, info.getDistance());
-
+                     
                      routeDirect(queue, message);
                   }
                }
@@ -994,4 +1082,6 @@
 
    }
 
+ 
+
 }

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/RemotingConnectionImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/RemotingConnectionImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/RemotingConnectionImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -1130,7 +1130,7 @@
                }
 
                connection.transportConnection.write(buffer);
-
+               
                long toWait = connection.blockingCallTimeout;
 
                long start = System.currentTimeMillis();

Modified: trunk/src/main/org/jboss/messaging/core/security/impl/SecurityStoreImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/security/impl/SecurityStoreImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/security/impl/SecurityStoreImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -263,7 +263,7 @@
       // Sanity check
       if (DEFAULT_MANAGEMENT_CLUSTER_PASSWORD.equals(password))
       {
-         log.warn("WARNING! POTENTIAL SECURITY RISK. It has been detected that the cluster admin password which is used to " +
+         log.warn("It has been detected that the cluster admin password which is used to " +
                   "replicate management operation from one node to the other has not had its password changed from the installation default. " +
                   "Please see the JBoss Messaging user guide for instructions on how to do this.");
       }

Modified: trunk/src/main/org/jboss/messaging/core/server/Queue.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/Queue.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/Queue.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -23,6 +23,7 @@
 package org.jboss.messaging.core.server;
 
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Executor;
 
 import org.jboss.messaging.core.filter.Filter;
@@ -47,21 +48,21 @@
    long getPersistenceID();
 
    void setPersistenceID(long id);
-   
+
    Filter getFilter();
 
    boolean isDurable();
 
    boolean isTemporary();
 
-   void addConsumer(Consumer consumer);
+   void addConsumer(Consumer consumer) throws Exception;
 
    boolean removeConsumer(Consumer consumer) throws Exception;
 
    int getConsumerCount();
-   
-   List<Consumer> getConsumers();
 
+   Set<Consumer> getConsumers();
+
    void addLast(MessageReference ref);
 
    void addFirst(MessageReference ref);
@@ -69,11 +70,11 @@
    void acknowledge(MessageReference ref) throws Exception;
 
    void acknowledge(Transaction tx, MessageReference ref) throws Exception;
-   
+
    void reacknowledge(Transaction tx, MessageReference ref) throws Exception;
 
    void cancel(Transaction tx, MessageReference ref) throws Exception;
-   
+
    void cancel(MessageReference reference) throws Exception;
 
    void deliverAsync(Executor executor);
@@ -98,9 +99,6 @@
 
    MessageReference removeReferenceWithID(long id) throws Exception;
 
-   /** Remove message from queue, add it to the scheduled delivery list without affect reference counting */
-   //void rescheduleDelivery(long id, long scheduledDeliveryTime);
-
    MessageReference getReference(long id);
 
    int deleteAllReferences() throws Exception;
@@ -138,6 +136,10 @@
 
    boolean consumerFailedOver();
 
+   void addRedistributor(long delay, Executor executor);
+
+   void cancelRedistributor() throws Exception;
+
    // Only used in testing
    void deliverNow();
 }

Modified: trunk/src/main/org/jboss/messaging/core/server/cluster/ClusterManager.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/cluster/ClusterManager.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/cluster/ClusterManager.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -23,6 +23,7 @@
 package org.jboss.messaging.core.server.cluster;
 
 import java.util.Map;
+import java.util.Set;
 
 import org.jboss.messaging.core.server.MessagingComponent;
 
@@ -37,4 +38,6 @@
 public interface ClusterManager extends MessagingComponent
 {
    Map<String, Bridge> getBridges();
+   
+   Set<ClusterConnection> getClusterConnections();
 }

Modified: trunk/src/main/org/jboss/messaging/core/server/cluster/impl/BridgeImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/cluster/impl/BridgeImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/cluster/impl/BridgeImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -27,6 +27,7 @@
 import static org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl.DEFAULT_BLOCK_ON_ACKNOWLEDGE;
 import static org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl.DEFAULT_BLOCK_ON_NON_PERSISTENT_SEND;
 import static org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl.DEFAULT_BLOCK_ON_PERSISTENT_SEND;
+import static org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl.DEFAULT_CALL_TIMEOUT;
 import static org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl.DEFAULT_CONNECTION_LOAD_BALANCING_POLICY_CLASS_NAME;
 import static org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl.DEFAULT_CONNECTION_TTL;
 import static org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl.DEFAULT_CONSUMER_MAX_RATE;
@@ -162,8 +163,8 @@
                      final double retryIntervalMultiplier,
                      final int maxRetriesBeforeFailover,
                      final int maxRetriesAfterFailover,
-                     final boolean useDuplicateDetection, 
-                     final SimpleString managementAddress, 
+                     final boolean useDuplicateDetection,
+                     final SimpleString managementAddress,
                      final SimpleString managementNotificationAddress,
                      final String clusterPassword) throws Exception
    {
@@ -199,7 +200,7 @@
                      final int maxRetriesBeforeFailover,
                      final int maxRetriesAfterFailover,
                      final boolean useDuplicateDetection,
-                     final SimpleString managementAddress, 
+                     final SimpleString managementAddress,
                      final SimpleString managementNotificationAddress,
                      final String clusterPassword,
                      final MessageFlowRecord flowRecord) throws Exception
@@ -240,11 +241,11 @@
       this.idsHeaderName = MessageImpl.HDR_ROUTE_TO_IDS.concat(name);
 
       this.managementAddress = managementAddress;
-      
+
       this.managementNotificationAddres = managementNotificationAddress;
-      
+
       this.clusterPassword = clusterPassword;
-      
+
       this.flowRecord = flowRecord;
    }
 
@@ -282,16 +283,17 @@
    {
       if (started)
       {
-         //We need to stop the csf here otherwise the stop runnable never runs since the createobjectsrunnable is trying to connect to the target
-         //server which isn't up in an infinite loop
+         // We need to stop the csf here otherwise the stop runnable never runs since the createobjectsrunnable is
+         // trying to connect to the target
+         // server which isn't up in an infinite loop
          if (csf != null)
          {
             csf.close();
          }
       }
-      
+
       executor.execute(new StopRunnable());
-      
+
       this.waitForRunnablesToComplete();
    }
 
@@ -309,8 +311,8 @@
                }
 
                if (session != null)
-               {    
-                  session.close();               
+               {
+                  session.close();
                }
 
                started = false;
@@ -321,7 +323,7 @@
 
             queue.removeConsumer(BridgeImpl.this);
 
-            cancelRefs();            
+            cancelRefs();
          }
          catch (Exception e)
          {
@@ -352,7 +354,7 @@
                   log.error("Failed to reset", e);
                }
             }
-            
+
             active = false;
          }
 
@@ -374,7 +376,7 @@
          if (!createObjects())
          {
             started = false;
-         }         
+         }
       }
    }
 
@@ -407,7 +409,7 @@
       {
          return false;
       }
-      
+
       try
       {
          queue.addConsumer(BridgeImpl.this);
@@ -417,7 +419,7 @@
                                             DEFAULT_CONNECTION_LOAD_BALANCING_POLICY_CLASS_NAME,
                                             DEFAULT_PING_PERIOD,
                                             DEFAULT_CONNECTION_TTL,
-                                            2000,
+                                            5000,
                                             DEFAULT_CONSUMER_WINDOW_SIZE,
                                             DEFAULT_CONSUMER_MAX_RATE,
                                             DEFAULT_SEND_WINDOW_SIZE,
@@ -435,7 +437,13 @@
                                             maxRetriesBeforeFailover,
                                             maxRetriesAfterFailover);
 
-         session = (ClientSessionInternal)csf.createSession(SecurityStoreImpl.CLUSTER_ADMIN_USER, clusterPassword, false, true, true, false, 1);
+         session = (ClientSessionInternal)csf.createSession(SecurityStoreImpl.CLUSTER_ADMIN_USER,
+                                                            clusterPassword,
+                                                            false,
+                                                            true,
+                                                            true,
+                                                            false,
+                                                            1);
 
          if (session == null)
          {
@@ -507,8 +515,6 @@
 
          queue.deliverAsync(executor);
 
-         log.info("Bridge " + name + " connected successfully");
-
          return true;
       }
       catch (Exception e)
@@ -697,7 +703,7 @@
          if (!createObjects())
          {
             active = false;
-            
+
             started = false;
          }
       }

Modified: trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterConnectionImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterConnectionImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterConnectionImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -547,7 +547,7 @@
                   postOffice.addBinding(binding);
    
                   Bindings theBindings = postOffice.getBindingsForAddress(queueAddress);
-   
+                  
                   theBindings.setRouteWhenNoConsumers(routeWhenNoConsumers);
                   
                   break;
@@ -627,7 +627,7 @@
                   Notification notification = new Notification(ntype, message.getProperties());
                   
                   managementService.sendNotification(notification);
-                  
+
                   break;
                }
             }

Modified: trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterManagerImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterManagerImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/cluster/impl/ClusterManagerImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -27,8 +27,10 @@
 import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 
@@ -200,6 +202,11 @@
    {
       return new HashMap<String, Bridge>(bridges);
    }
+   
+   public Set<ClusterConnection> getClusterConnections()
+   {
+      return new HashSet<ClusterConnection>(clusters.values());
+   }
 
    private synchronized void deployBroadcastGroup(final BroadcastGroupConfiguration config) throws Exception
    {

Added: trunk/src/main/org/jboss/messaging/core/server/cluster/impl/Redistributor.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/cluster/impl/Redistributor.java	                        (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/server/cluster/impl/Redistributor.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -0,0 +1,177 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005-2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.messaging.core.server.cluster.impl;
+
+import java.util.concurrent.Executor;
+
+import org.jboss.messaging.core.filter.Filter;
+import org.jboss.messaging.core.logging.Logger;
+import org.jboss.messaging.core.persistence.StorageManager;
+import org.jboss.messaging.core.postoffice.PostOffice;
+import org.jboss.messaging.core.server.Consumer;
+import org.jboss.messaging.core.server.HandleStatus;
+import org.jboss.messaging.core.server.MessageReference;
+import org.jboss.messaging.core.server.Queue;
+import org.jboss.messaging.core.transaction.Transaction;
+import org.jboss.messaging.core.transaction.impl.TransactionImpl;
+import org.jboss.messaging.util.Future;
+
+/**
+ * A Redistributor
+ *
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * 
+ * Created 8 Feb 2009 14:23:41
+ *
+ *
+ */
+public class Redistributor implements Consumer
+{
+   private static final Logger log = Logger.getLogger(Redistributor.class);
+
+   private boolean active;
+   
+   private final StorageManager storageManager;
+
+   private final PostOffice postOffice;
+
+   private final Executor executor;
+
+   private final int batchSize;
+
+   private final Queue queue;
+
+   private int count;
+   
+   public Redistributor(final Queue queue,
+                        final StorageManager storageManager,
+                        final PostOffice postOffice,
+                        final Executor executor,
+                        final int batchSize)
+   {
+      this.queue = queue;
+      
+      this.storageManager = storageManager;
+     
+      this.postOffice = postOffice;
+
+      this.executor = executor;
+
+      this.batchSize = batchSize;
+   }
+   
+   public Filter getFilter()
+   {
+      return null;
+   }
+   
+   public synchronized void start()
+   {
+      active = true;
+   }
+   
+   public synchronized void stop() throws Exception
+   {
+      active = false;
+            
+      Future future = new Future();
+      
+      executor.execute(future);
+      
+      boolean ok = future.await(10000);
+      
+      if (!ok)
+      {
+         log.warn("Timed out waiting for tasks to complete");
+      }
+   }
+
+   public synchronized void close()
+   {
+      Future future = new Future();
+
+      executor.execute(future);
+
+      boolean ok = future.await(10000);
+
+      if (!ok)
+      {
+         throw new IllegalStateException("Timed out waiting for executor to complete");
+      }
+
+      active = false;
+   }
+
+   public synchronized HandleStatus handle(final MessageReference reference) throws Exception
+   {
+      if (!active)
+      {
+         return HandleStatus.BUSY;
+      }
+        
+      Transaction tx = new TransactionImpl(storageManager);
+
+      boolean routed = postOffice.redistribute(reference.getMessage(), queue.getName(), tx);
+
+      if (routed)
+      {
+         queue.referenceHandled();
+
+         queue.acknowledge(tx, reference);
+
+         tx.commit();
+  
+         count++;
+
+         if (count == batchSize)
+         {
+            // We continue the next batch on a different thread, so as not to keep the delivery thread busy for a very
+            // long time, in the case there are many messages in the queue
+            active = false;
+
+            executor.execute(new Prompter());
+
+            count = 0;
+         }
+
+         return HandleStatus.HANDLED;
+      }
+      else
+      {
+         return HandleStatus.BUSY;
+      }
+   }
+
+   private class Prompter implements Runnable
+   {
+      public void run()
+      {
+         synchronized (Redistributor.this)
+         {
+            active = true;
+
+            queue.deliverAsync(executor);
+         }
+      }
+   }
+}

Modified: trunk/src/main/org/jboss/messaging/core/server/impl/MessagingServerImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/impl/MessagingServerImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/impl/MessagingServerImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -245,7 +245,10 @@
                                       configuration.isWildcardRoutingEnabled(),
                                       configuration.isBackup(),
                                       configuration.getIDCacheSize(),
-                                      configuration.isPersistIDCache());
+                                      configuration.isPersistIDCache(),
+                                      executorFactory,                                                           
+                                      addressSettingsRepository,
+                                      nodeID.toString());
 
       securityRepository = new HierarchicalObjectRepository<Set<Role>>();
       securityRepository.setDefault(new HashSet<Role>());
@@ -260,7 +263,7 @@
       managementService.setManagementNotificationAddress(configuration.getManagementNotificationAddress());
       managementService.setClusterPassword(configuration.getManagementClusterPassword());
       managementService.setManagementRequestTimeout(configuration.getManagementRequestTimeout());
-      
+
       serverManagement = managementService.registerServer(postOffice,
                                                           storageManager,
                                                           configuration,
@@ -723,7 +726,7 @@
                                                                                                                         listener);
 
          listener.conn = replicatingConnection;
-    
+
          replicatingConnection.startPinger();
 
          return replicatingConnection;
@@ -1010,32 +1013,32 @@
          queue.activateNow(asyncDeliveryPool);
       }
    }
-   
+
    private class NoCacheConnectionLifeCycleListener implements ConnectionLifeCycleListener
    {
       private RemotingConnection conn;
-      
+
       public void connectionCreated(final Connection connection)
-      {         
+      {
       }
 
       public void connectionDestroyed(final Object connectionID)
-      {   
+      {
          if (conn != null)
          {
             conn.destroy();
-         }                 
+         }
       }
 
       public void connectionException(final Object connectionID, final MessagingException me)
-      {                   
+      {
          backupConnectorFactory = null;
-         
+
          if (conn != null)
          {
             conn.fail(me);
          }
-      }      
+      }
    }
 
 }

Modified: trunk/src/main/org/jboss/messaging/core/server/impl/QueueFactoryImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/impl/QueueFactoryImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/impl/QueueFactoryImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -51,7 +51,7 @@
    private PostOffice postOffice;
 
    private final StorageManager storageManager;
-      
+
    public QueueFactoryImpl(final ScheduledExecutorService scheduledExecutor,
                            final HierarchicalRepository<AddressSettings> addressSettingsRepository,
                            final StorageManager storageManager)
@@ -76,32 +76,35 @@
                             final boolean temporary)
    {
       AddressSettings addressSettings = addressSettingsRepository.getMatch(address.toString());
-      
+
       Queue queue;
-      if(addressSettings.isSoloQueue())
+      if (addressSettings.isSoloQueue())
       {
-         queue = new SoloQueueImpl(persistenceID,address, name,
-                                  filter,
-                                  durable,
-                                  temporary,
-                                  scheduledExecutor,
-                                  postOffice,
-                                  storageManager,
-                                  addressSettingsRepository);
+         queue = new SoloQueueImpl(persistenceID,
+                                   address,
+                                   name,
+                                   filter,
+                                   durable,
+                                   temporary,
+                                   scheduledExecutor,
+                                   postOffice,
+                                   storageManager,
+                                   addressSettingsRepository);
       }
       else
       {
-         queue = new QueueImpl(persistenceID, address,name,
-                                  filter,
-                                  durable,
-                                  temporary,
-                                  scheduledExecutor,
-                                  postOffice,
-                                  storageManager,
-                                  addressSettingsRepository);
+         queue = new QueueImpl(persistenceID,
+                               address,
+                               name,
+                               filter,
+                               durable,
+                               temporary,
+                               scheduledExecutor,
+                               postOffice,
+                               storageManager,
+                               addressSettingsRepository);
       }
 
-
       queue.setDistributionPolicy(addressSettings.getDistributionPolicy());
 
       return queue;

Modified: trunk/src/main/org/jboss/messaging/core/server/impl/QueueImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/impl/QueueImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/impl/QueueImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -26,6 +26,8 @@
 import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -46,6 +48,7 @@
 import org.jboss.messaging.core.server.Queue;
 import org.jboss.messaging.core.server.ScheduledDeliveryHandler;
 import org.jboss.messaging.core.server.ServerMessage;
+import org.jboss.messaging.core.server.cluster.impl.Redistributor;
 import org.jboss.messaging.core.settings.HierarchicalRepository;
 import org.jboss.messaging.core.settings.impl.AddressSettings;
 import org.jboss.messaging.core.transaction.Transaction;
@@ -68,6 +71,8 @@
 {
    private static final Logger log = Logger.getLogger(QueueImpl.class);
 
+   public static final int REDISTRIBUTOR_BATCH_SIZE = 100;
+
    private static final boolean trace = log.isTraceEnabled();
 
    public static final int NUM_PRIORITIES = 10;
@@ -111,13 +116,25 @@
    private final StorageManager storageManager;
 
    private final HierarchicalRepository<AddressSettings> addressSettingsRepository;
+   
+   private final ScheduledExecutorService scheduledExecutor;
 
    private volatile boolean backup;
 
    private int consumersToFailover = -1;
 
    private SimpleString address;
+   
+   private Redistributor redistributor;
 
+   private final Set<ScheduledFuture<?>> futures = new ConcurrentHashSet<ScheduledFuture<?>>();
+  
+   private ScheduledFuture<?> future;
+   
+   //We cache the consumers here since we don't want to include the redistributor
+   
+   private final Set<Consumer> consumers = new HashSet<Consumer>();
+   
    public QueueImpl(final long persistenceID,
                     final SimpleString address,
                     final SimpleString name,
@@ -131,7 +148,7 @@
    {
       this.persistenceID = persistenceID;
 
-      this.address =  address;
+      this.address = address;
 
       this.name = name;
 
@@ -146,6 +163,8 @@
       this.storageManager = storageManager;
 
       this.addressSettingsRepository = addressSettingsRepository;
+      
+      this.scheduledExecutor = scheduledExecutor;
 
       if (postOffice == null)
       {
@@ -208,7 +227,7 @@
 
       store.addSize(ref.getMemoryEstimate());
 
-      Long scheduledDeliveryTime = (Long) message.getProperty(MessageImpl.HDR_SCHEDULED_DELIVERY_TIME);
+      Long scheduledDeliveryTime = (Long)message.getProperty(MessageImpl.HDR_SCHEDULED_DELIVERY_TIME);
 
       if (scheduledDeliveryTime != null)
       {
@@ -233,7 +252,7 @@
          {
             storageManager.updateScheduledDeliveryTime(ref);
          }
-
+ 
          addLast(ref);
       }
       else
@@ -285,7 +304,7 @@
          message.incrementDurableRefCount();
       }
 
-      Long scheduledDeliveryTime = (Long) message.getProperty(MessageImpl.HDR_SCHEDULED_DELIVERY_TIME);
+      Long scheduledDeliveryTime = (Long)message.getProperty(MessageImpl.HDR_SCHEDULED_DELIVERY_TIME);
 
       if (scheduledDeliveryTime != null)
       {
@@ -364,9 +383,13 @@
       deliver();
    }
 
-   public void addConsumer(final Consumer consumer)
+   public synchronized void addConsumer(final Consumer consumer) throws Exception
    {
+      cancelRedistributor();
+
       distributionPolicy.addConsumer(consumer);
+      
+      consumers.add(consumer);
    }
 
    public synchronized boolean removeConsumer(final Consumer consumer) throws Exception
@@ -377,18 +400,66 @@
       {
          promptDelivery = false;
       }
+      
+      consumers.remove(consumer);
 
       return removed;
    }
 
+   public synchronized void addRedistributor(final long delay, final Executor executor)
+   {
+      if (future != null)
+      {
+         future.cancel(false);
+         
+         futures.remove(future);
+      }
+      
+      if (redistributor != null)
+      {
+         //Just prompt delivery
+         deliverAsync(executor);
+      }
+            
+      if (delay > 0)
+      {
+         DelayedAddRedistributor dar = new DelayedAddRedistributor(executor);
+         
+         future = scheduledExecutor.schedule(dar, delay, TimeUnit.MILLISECONDS);
+         
+         futures.add(future);
+      }
+      else
+      {
+         internalAddRedistributor(executor);
+      }
+   }
+   
+   public synchronized void cancelRedistributor() throws Exception
+   {            
+      if (redistributor != null)
+      {
+         redistributor.stop();
+
+         redistributor = null;
+      }
+      
+      if (future != null)
+      {
+         future.cancel(false);
+         
+         future = null;
+      }
+   }
+   
    public synchronized int getConsumerCount()
    {
-      return distributionPolicy.getConsumerCount();
+      return consumers.size();
    }
 
-   public synchronized List<Consumer> getConsumers()
+   public synchronized Set<Consumer> getConsumers()
    {
-      return new ArrayList<Consumer>(distributionPolicy.getConsumers());
+      return consumers;
    }
 
    public synchronized List<MessageReference> list(final Filter filter)
@@ -465,7 +536,15 @@
    {
       int count = messageReferences.size() + getScheduledCount() + getDeliveringCount();
 
-      // log.info(System.identityHashCode(this) + " message count is " + count + " ( mr:" + messageReferences.size() + " sc:" + getScheduledCount() + " dc:" + getDeliveringCount() + ")");
+//      log.info(System.identityHashCode(this) + " message count is " +
+//               count +
+//               " ( mr:" +
+//               messageReferences.size() +
+//               " sc:" +
+//               getScheduledCount() +
+//               " dc:" +
+//               getDeliveringCount() +
+//               ")");
 
       return count;
    }
@@ -529,7 +608,7 @@
 
    final RefsOperation getRefsOperation(final Transaction tx)
    {
-      RefsOperation oper = (RefsOperation) tx.getProperty(TransactionPropertyIndexes.REFS_OPERATION);
+      RefsOperation oper = (RefsOperation)tx.getProperty(TransactionPropertyIndexes.REFS_OPERATION);
 
       if (oper == null)
       {
@@ -547,7 +626,7 @@
    {
       getRefsOperation(tx).addAck(reference);
    }
-   
+
    public void cancel(final MessageReference reference) throws Exception
    {
       if (checkDLQ(reference))
@@ -558,7 +637,7 @@
          }
       }
    }
-     
+
    public void expire(final MessageReference ref) throws Exception
    {
       SimpleString expiryAddress = addressSettingsRepository.getMatch(address.toString()).getExpiryAddress();
@@ -834,7 +913,7 @@
 
    public synchronized boolean activate()
    {
-      consumersToFailover = distributionPolicy.getConsumerCount();
+      consumersToFailover = consumers.size();
 
       if (consumersToFailover == 0)
       {
@@ -908,6 +987,21 @@
    // Private
    // ------------------------------------------------------------------------------
 
+   private void internalAddRedistributor(final Executor executor)
+   {     
+      if (consumers.size() == 0 && messageReferences.size() > 0)
+      {
+         redistributor = new Redistributor(this, storageManager, postOffice, executor, REDISTRIBUTOR_BATCH_SIZE);
+
+         distributionPolicy.addConsumer(redistributor);
+
+         redistributor.start();
+
+         deliverAsync(executor);
+      }
+   }
+
+   
    private boolean checkDLQ(final MessageReference reference) throws Exception
    {
       ServerMessage message = reference.getMessage();
@@ -945,7 +1039,7 @@
          return true;
       }
    }
-   
+
    private void move(final SimpleString toAddress, final MessageReference ref) throws Exception
    {
       move(toAddress, ref, false);
@@ -1065,8 +1159,6 @@
       tx.commit();
    }
 
-
-
    /*
     * Attempt to deliver all the messages in the queue
     */
@@ -1076,7 +1168,7 @@
       // because it's async and could get out of step
       // with the live node. Instead, when we replicate the delivery we remove
       // the ref from the queue
-      
+
       if (backup)
       {
          return;
@@ -1085,7 +1177,7 @@
       MessageReference reference;
 
       Iterator<MessageReference> iterator = null;
-      
+
       while (true)
       {
          if (iterator == null)
@@ -1186,7 +1278,7 @@
       if (direct && !backup)
       {
          // Deliver directly
-     
+
          HandleStatus status = deliver(ref);
 
          if (status == HandleStatus.HANDLED)
@@ -1265,7 +1357,7 @@
    {
       ServerMessage message = ref.getMessage();
 
-      QueueImpl queue = (QueueImpl) ref.getQueue();
+      QueueImpl queue = (QueueImpl)ref.getQueue();
 
       boolean durableRef = message.isDurable() && queue.durable;
 
@@ -1312,7 +1404,7 @@
    }
 
    void postRollback(LinkedList<MessageReference> refs) throws Exception
-   {      
+   {
       synchronized (this)
       {
          for (MessageReference ref : refs)
@@ -1328,6 +1420,7 @@
          deliver();
       }
    }
+
    // Inner classes
    // --------------------------------------------------------------------------
 
@@ -1383,7 +1476,7 @@
                {
                   toCancel = new LinkedList<MessageReference>();
 
-                  queueMap.put((QueueImpl) ref.getQueue(), toCancel);
+                  queueMap.put((QueueImpl)ref.getQueue(), toCancel);
                }
 
                toCancel.addFirst(ref);
@@ -1442,4 +1535,24 @@
          }
       }
    }
+   
+   private class DelayedAddRedistributor implements Runnable
+   {
+      private final Executor executor;
+
+      DelayedAddRedistributor(final Executor executor)
+      {
+         this.executor = executor;
+      }
+
+      public void run()
+      {
+         synchronized (QueueImpl.this)
+         {
+            internalAddRedistributor(executor);
+   
+            futures.remove(this);
+         }
+      }
+   }
 }

Modified: trunk/src/main/org/jboss/messaging/core/server/impl/ServerConsumerImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/impl/ServerConsumerImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/impl/ServerConsumerImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -150,7 +150,7 @@
                              final Channel channel,
                              final boolean preAcknowledge,
                              final Executor executor,
-                             final ManagementService managementService)
+                             final ManagementService managementService) throws Exception
    {
       this.id = id;
 
@@ -283,7 +283,6 @@
       {
          MessageReference ref = iter.next();
 
-         // ref.cancel(tx, storageManager, postOffice, addressSettingsRepository);
          ref.getQueue().cancel(tx, ref);
       }
 
@@ -296,6 +295,8 @@
          props.putStringProperty(ManagementHelper.HDR_ADDRESS, binding.getAddress());
 
          props.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, binding.getClusterName());
+         
+         props.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, binding.getRoutingName());
 
          props.putStringProperty(ManagementHelper.HDR_FILTERSTRING,
                                  filter == null ? null : filter.getFilterString());

Modified: trunk/src/main/org/jboss/messaging/core/server/impl/ServerSessionImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/server/impl/ServerSessionImpl.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/server/impl/ServerSessionImpl.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -92,8 +92,6 @@
 import org.jboss.messaging.core.server.ServerConsumer;
 import org.jboss.messaging.core.server.ServerMessage;
 import org.jboss.messaging.core.server.ServerSession;
-import org.jboss.messaging.core.settings.HierarchicalRepository;
-import org.jboss.messaging.core.settings.impl.AddressSettings;
 import org.jboss.messaging.core.transaction.ResourceManager;
 import org.jboss.messaging.core.transaction.Transaction;
 import org.jboss.messaging.core.transaction.impl.TransactionImpl;
@@ -1427,6 +1425,8 @@
             
             props.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, binding.getClusterName());
             
+            props.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, binding.getRoutingName());
+            
             props.putIntProperty(ManagementHelper.HDR_DISTANCE, binding.getDistance());
                         
             if (filterString != null)

Modified: trunk/src/main/org/jboss/messaging/core/settings/impl/AddressSettings.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/settings/impl/AddressSettings.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/src/main/org/jboss/messaging/core/settings/impl/AddressSettings.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -43,8 +43,6 @@
     */
    public static final Class<?> DEFAULT_DISTRIBUTION_POLICY_CLASS = new RoundRobinDistributor().getClass();
 
-   public static final Boolean DEFAULT_CLUSTERED = false;
-
    public static final Integer DEFAULT_MAX_SIZE_BYTES = -1;
 
    public static final Boolean DEFAULT_DROP_MESSAGES_WHEN_FULL = Boolean.FALSE;
@@ -56,9 +54,9 @@
    public static final Long DEFAULT_REDELIVER_DELAY = 0L;
 
    public static final Boolean DEFAULT_SOLOQUEUE = false;
+   
+   public static final Long DEFAULT_REDISTRIBUTION_DELAY = -1L;
 
-   private Boolean clustered = null;
-
    private Integer maxSizeBytes = null;
 
    private Integer pageSizeBytes = null;
@@ -75,9 +73,11 @@
 
    private SimpleString deadLetterAddress = null;
 
-   private SimpleString ExpiryAddress = null;
+   private SimpleString expiryAddress = null;
 
    private Boolean soloQueue = null;
+   
+   private Long redistributionDelay = null;
 
    public Boolean isSoloQueue()
    {
@@ -89,16 +89,6 @@
       this.soloQueue = soloQueue;
    }
 
-   public Boolean isClustered()
-   {
-      return clustered != null ? clustered : DEFAULT_CLUSTERED;
-   }
-
-   public void setClustered(Boolean clustered)
-   {
-      this.clustered = clustered;
-   }
-
    public Integer getPageSizeBytes()
    {
       return pageSizeBytes;
@@ -182,12 +172,12 @@
 
    public SimpleString getExpiryAddress()
    {
-      return ExpiryAddress;
+      return expiryAddress;
    }
 
    public void setExpiryAddress(SimpleString expiryAddress)
    {
-      ExpiryAddress = expiryAddress;
+      this.expiryAddress = expiryAddress;
    }
 
    public Distributor getDistributionPolicy()
@@ -208,6 +198,16 @@
          throw new IllegalArgumentException("Error instantiating distribution policy '" + e + " '");
       }
    }
+   
+   public Long getRedistributionDelay()
+   {
+      return redistributionDelay != null ? redistributionDelay : DEFAULT_REDISTRIBUTION_DELAY;
+   }
+   
+   public void setRedistributionDelay(final Long redistributionDelay)
+   {
+      this.redistributionDelay = redistributionDelay;
+   }
 
    /**
     * merge 2 objects in to 1
@@ -215,10 +215,6 @@
     */
    public void merge(AddressSettings merged)
    {
-      if (clustered == null)
-      {
-         clustered = merged.clustered;
-      }
       if (maxDeliveryAttempts == null)
       {
          maxDeliveryAttempts = merged.maxDeliveryAttempts;
@@ -251,10 +247,14 @@
       {
          deadLetterAddress = merged.deadLetterAddress;
       }
-      if (ExpiryAddress == null)
+      if (expiryAddress == null)
       {
-         ExpiryAddress = merged.ExpiryAddress;
+         expiryAddress = merged.expiryAddress;
       }
+      if (redistributionDelay == null)
+      {
+         this.redistributionDelay = merged.redistributionDelay;
+      }
    }
 
 }

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/ClusterTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/ClusterTestBase.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/ClusterTestBase.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -27,6 +27,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -51,6 +52,7 @@
 import org.jboss.messaging.core.postoffice.impl.LocalQueueBinding;
 import org.jboss.messaging.core.server.Messaging;
 import org.jboss.messaging.core.server.MessagingService;
+import org.jboss.messaging.core.server.cluster.ClusterConnection;
 import org.jboss.messaging.core.server.cluster.RemoteQueueBinding;
 import org.jboss.messaging.tests.util.ServiceTestBase;
 import org.jboss.messaging.util.Pair;
@@ -121,15 +123,15 @@
                                   final int consumerCount,
                                   final boolean local) throws Exception
    {
-//       log.info("waiting for bindings on node " + node +
-//       " address " +
-//       address +
-//       " count " +
-//       count +
-//       " consumerCount " +
-//       consumerCount +
-//       " local " +
-//       local);
+//      log.info("waiting for bindings on node " + node +
+//               " address " +
+//               address +
+//               " count " +
+//               count +
+//               " consumerCount " +
+//               consumerCount +
+//               " local " +
+//               local);
       MessagingService service = this.services[node];
 
       if (service == null)
@@ -305,7 +307,7 @@
       sfs[node] = null;
    }
 
-   protected void send(int node, String address, int numMessages, boolean durable, String filterVal) throws Exception
+   protected void sendInRange(int node, String address, int msgStart, int msgEnd, boolean durable, String filterVal) throws Exception
    {
       ClientSessionFactory sf = this.sfs[node];
 
@@ -318,7 +320,7 @@
 
       ClientProducer producer = session.createProducer(address);
 
-      for (int i = 0; i < numMessages; i++)
+      for (int i = msgStart; i < msgEnd; i++)
       {
          ClientMessage message = session.createClientMessage(durable);
 
@@ -335,8 +337,18 @@
       session.close();
    }
 
-   protected void verifyReceiveAll(int numMessages, int... consumerIDs) throws Exception
+   protected void send(int node, String address, int numMessages, boolean durable, String filterVal) throws Exception
    {
+      sendInRange(node, address, 0, numMessages, durable, filterVal);
+   }
+
+   protected void verifyReceiveAllInRange(int msgStart, int msgEnd, int... consumerIDs) throws Exception
+   {
+      verifyReceiveAllInRangeNotBefore(-1, msgStart, msgEnd, consumerIDs);
+   }
+   
+   protected void verifyReceiveAllInRangeNotBefore(long firstReceiveTime, int msgStart, int msgEnd, int... consumerIDs) throws Exception
+   {
       for (int i = 0; i < consumerIDs.length; i++)
       {
          ConsumerHolder holder = consumers[consumerIDs[i]];
@@ -346,17 +358,32 @@
             throw new IllegalArgumentException("No consumer at " + consumerIDs[i]);
          }
 
-         for (int j = 0; j < numMessages; j++)
+         for (int j = msgStart; j < msgEnd; j++)
          {
-            ClientMessage message = holder.consumer.receive(500);
-
+            ClientMessage message = holder.consumer.receive(2000);
+            
             assertNotNull("consumer " + consumerIDs[i] + " did not receive message " + j, message);
+            
+            if (firstReceiveTime != -1)
+            {
+               assertTrue("Message received too soon", System.currentTimeMillis() >= firstReceiveTime);
+            }
 
             assertEquals(j, message.getProperty(COUNT_PROP));
          }
       }
    }
 
+   protected void verifyReceiveAll(int numMessages, int... consumerIDs) throws Exception
+   {
+      verifyReceiveAllInRange(0, numMessages, consumerIDs);
+   }
+   
+   protected void verifyReceiveAllNotBefore(long firstReceiveTime, int numMessages, int... consumerIDs) throws Exception
+   {
+      verifyReceiveAllInRangeNotBefore(firstReceiveTime, 0, numMessages, consumerIDs);
+   }
+
    protected void checkReceive(int... consumerIDs) throws Exception
    {
       for (int i = 0; i < consumerIDs.length; i++)
@@ -472,11 +499,141 @@
       }
    }
 
+   protected void verifyReceiveRoundRobinInSomeOrderWithCounts(boolean ack, int[] messageCounts, int... consumerIDs) throws Exception
+   {
+      List<LinkedList<Integer>> receivedCounts = new ArrayList<LinkedList<Integer>>();
+
+      Set<Integer> counts = new HashSet<Integer>();
+
+      for (int i = 0; i < consumerIDs.length; i++)
+      {
+         ConsumerHolder holder = consumers[consumerIDs[i]];
+
+         if (holder == null)
+         {
+            throw new IllegalArgumentException("No consumer at " + consumerIDs[i]);
+         }
+
+         LinkedList<Integer> list = new LinkedList<Integer>();
+
+         receivedCounts.add(list);
+
+         ClientMessage message;
+         do
+         {
+            message = holder.consumer.receive(200);
+
+            if (message != null)
+            {
+               int count = (Integer)message.getProperty(COUNT_PROP);
+
+               //log.info("consumer " + consumerIDs[i] + " received message " + count);
+
+               assertFalse(counts.contains(count));
+
+               counts.add(count);
+
+               list.add(count);
+
+               if (ack)
+               {
+                  message.acknowledge();
+               }
+            }
+         }
+         while (message != null);
+      }
+
+      for (int i = 0; i < messageCounts.length; i++)
+      {
+         assertTrue(counts.contains(messageCounts[i]));
+      }
+
+      LinkedList[] lists = new LinkedList[consumerIDs.length];
+
+      for (int i = 0; i < messageCounts.length; i++)
+      {
+         for (LinkedList<Integer> list : receivedCounts)
+         {
+            int elem = list.get(0);
+
+            if (elem == messageCounts[i])
+            {
+               lists[i] = list;
+
+               break;
+            }
+         }
+      }
+      int index = 0;
+
+      for (int i = 0; i < messageCounts.length; i++)
+      {
+         LinkedList list = lists[index];
+
+         assertNotNull(list);
+
+         int elem = (Integer)list.poll();
+
+         assertEquals(messageCounts[i], elem);
+
+         //log.info("got elem " + messageCounts[i] + " at pos " + index);
+
+         index++;
+
+         if (index == lists.length)
+         {
+            index = 0;
+         }
+      }
+
+   }
+
    protected void verifyReceiveRoundRobinInSomeOrderNoAck(int numMessages, int... consumerIDs) throws Exception
    {
       verifyReceiveRoundRobinInSomeOrder(false, numMessages, consumerIDs);
    }
 
+   protected int[] getReceivedOrder(int consumerID) throws Exception
+   {
+      ConsumerHolder consumer = this.consumers[consumerID];
+
+      if (consumer == null)
+      {
+         throw new IllegalArgumentException("No consumer at " + consumerID);
+      }
+
+      List<Integer> ints = new ArrayList<Integer>();
+
+      ClientMessage message = null;
+
+      do
+      {
+         message = consumer.consumer.receive(500);
+
+         if (message != null)
+         {
+            int count = (Integer)message.getProperty(COUNT_PROP);
+
+            //log.info("consumer " + consumerID + " received message " + count);
+
+            ints.add(count);
+         }
+      }
+      while (message != null);
+
+      int[] res = new int[ints.size()];
+
+      int j = 0;
+
+      for (Integer i : ints)
+      {
+         res[j++] = i;
+      }
+
+      return res;
+   }
+
    protected void verifyNotReceive(int... consumerIDs) throws Exception
    {
       for (int i = 0; i < consumerIDs.length; i++)
@@ -520,6 +677,16 @@
       sfs[node] = sf;
    }
 
+   protected MessagingService getService(int node)
+   {
+      if (services[node] == null)
+      {
+         throw new IllegalArgumentException("No service at node " + node);
+      }
+
+      return services[node];
+   }
+
    protected void setupServer(int node, boolean fileStorage, boolean netty)
    {
       if (services[node] != null)
@@ -829,7 +996,7 @@
 
       ClusterConnectionConfiguration clusterConf = new ClusterConnectionConfiguration(name,
                                                                                       address,
-                                                                                      100,
+                                                                                      250,
                                                                                       1d,
                                                                                       -1,
                                                                                       -1,
@@ -840,6 +1007,7 @@
 
       serviceFrom.getServer().getConfiguration().getClusterConfigurations().add(clusterConf);
    }
+      
 
    protected void setupDiscoveryClusterConnection(String name,
                                                   int node,
@@ -880,15 +1048,29 @@
          services[nodes[i]].start();
       }
    }
+   
+   protected void stopClusterConnections(int... nodes) throws Exception
+   {
+      for (int i = 0; i < nodes.length; i++)
+      {
+         if (services[nodes[i]].isStarted())
+         {
+            for (ClusterConnection cc: services[nodes[i]].getServer().getClusterManager().getClusterConnections())
+            {
+               cc.stop();
+            }
+         }
+      }
+   }
 
    protected void stopServers(int... nodes) throws Exception
    {
       for (int i = 0; i < nodes.length; i++)
-      {        
+      {
          if (services[nodes[i]].isStarted())
          {
             services[nodes[i]].stop();
-         }  
+         }
       }
    }
 

Added: trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/MessageRedistributionTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/MessageRedistributionTest.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/MessageRedistributionTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -0,0 +1,615 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005-2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.messaging.tests.integration.cluster.distribution;
+
+import org.jboss.messaging.core.logging.Logger;
+import org.jboss.messaging.core.server.impl.QueueImpl;
+import org.jboss.messaging.core.settings.impl.AddressSettings;
+
+/**
+ * A MessageRedistributionTest
+ *
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * 
+ * Created 10 Feb 2009 18:41:57
+ *
+ *
+ */
+public class MessageRedistributionTest extends ClusterTestBase
+{
+   private static final Logger log = Logger.getLogger(SymmetricClusterTest.class);
+
+   @Override
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+
+      setupServers();
+      
+      setRedistributionDelay(0);      
+   }
+
+   @Override
+   protected void tearDown() throws Exception
+   {
+      stopServers();
+
+      super.tearDown();
+   }
+
+   protected boolean isNetty()
+   {
+      return false;
+   }
+
+   protected boolean isFileStorage()
+   {
+      return false;
+   }
+
+   public void testRedistributionWhenConsumerIsClosed() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);
+      addConsumer(1, 1, "queue0", null);
+      addConsumer(2, 2, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 2, false);
+      waitForBindings(1, "queues.testaddress", 2, 2, false);
+      waitForBindings(2, "queues.testaddress", 2, 2, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      getReceivedOrder(0);
+      int[] ids1 = getReceivedOrder(1);
+      getReceivedOrder(2);
+
+      removeConsumer(1);
+
+      verifyReceiveRoundRobinInSomeOrderWithCounts(false, ids1, 0, 2);
+   }
+
+   public void testRedistributionWhenConsumerIsClosedNotConsumersOnAllNodes() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(1, 1, "queue0", null);
+      addConsumer(2, 2, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 0, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 2, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      int[] ids1 = getReceivedOrder(1);
+      getReceivedOrder(2);
+
+      removeConsumer(1);
+
+      verifyReceiveRoundRobinInSomeOrderWithCounts(false, ids1, 2);
+   }
+
+   public void testNoRedistributionWhenConsumerIsClosedForwardWhenNoConsumersTrue() throws Exception
+   {
+      // x
+      setupCluster(true);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);
+      addConsumer(1, 1, "queue0", null);
+      addConsumer(2, 2, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 2, false);
+      waitForBindings(1, "queues.testaddress", 2, 2, false);
+      waitForBindings(2, "queues.testaddress", 2, 2, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      removeConsumer(1);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 1, false);
+      waitForBindings(1, "queues.testaddress", 2, 2, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      addConsumer(1, 1, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 2, false);
+      waitForBindings(1, "queues.testaddress", 2, 2, false);
+      waitForBindings(2, "queues.testaddress", 2, 2, false);
+
+      verifyReceiveRoundRobinInSomeOrder(20, 0, 1, 2);
+   }
+
+   public void testNoRedistributionWhenConsumerIsClosedNoConsumersOnOtherNodes() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(1, 1, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 0, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 1, false);
+      waitForBindings(1, "queues.testaddress", 2, 0, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      removeConsumer(1);
+
+      waitForBindings(0, "queues.testaddress", 1, 0, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 0, false);
+      waitForBindings(2, "queues.testaddress", 2, 0, false);
+
+      addConsumer(1, 1, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 0, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 1, false);
+      waitForBindings(1, "queues.testaddress", 2, 0, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      verifyReceiveAll(20, 1);
+   }
+
+   public void testRedistributionWhenConsumerIsClosedQueuesWithFilters() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      String filter1 = "giraffe";
+      String filter2 = "platypus";
+
+      createQueue(0, "queues.testaddress", "queue0", filter1, false);
+      createQueue(1, "queues.testaddress", "queue0", filter2, false);
+      createQueue(2, "queues.testaddress", "queue0", filter1, false);
+
+      addConsumer(0, 0, "queue0", null);
+      addConsumer(1, 1, "queue0", null);
+      addConsumer(2, 2, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 2, false);
+      waitForBindings(1, "queues.testaddress", 2, 2, false);
+      waitForBindings(2, "queues.testaddress", 2, 2, false);
+
+      send(0, "queues.testaddress", 20, false, filter1);
+
+      int[] ids0 = getReceivedOrder(0);
+      getReceivedOrder(1);
+      getReceivedOrder(2);
+
+      removeConsumer(0);
+
+      verifyReceiveRoundRobinInSomeOrderWithCounts(false, ids0, 2);
+   }
+
+   public void testRedistributionWhenConsumerIsClosedConsumersWithFilters() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      String filter1 = "giraffe";
+      String filter2 = "platypus";
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", filter1);
+      addConsumer(1, 1, "queue0", filter2);
+      addConsumer(2, 2, "queue0", filter1);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 2, false);
+      waitForBindings(1, "queues.testaddress", 2, 2, false);
+      waitForBindings(2, "queues.testaddress", 2, 2, false);
+
+      send(0, "queues.testaddress", 20, false, filter1);
+
+      int[] ids0 = getReceivedOrder(0);
+      getReceivedOrder(1);
+      getReceivedOrder(2);
+
+      removeConsumer(0);
+
+      verifyReceiveRoundRobinInSomeOrderWithCounts(false, ids0, 2);
+   }
+
+   public void testRedistributionWhenRemoteConsumerIsAdded() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      removeConsumer(0);
+
+      addConsumer(1, 1, "queue0", null);
+
+      verifyReceiveAll(20, 1);
+      verifyNotReceive(1);
+   }
+   
+   public void testBackAndForth() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      removeConsumer(0);
+      
+      waitForBindings(0, "queues.testaddress", 1, 0, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 0, false);
+      waitForBindings(2, "queues.testaddress", 2, 0, false);
+
+      addConsumer(1, 1, "queue0", null);
+      
+      waitForBindings(0, "queues.testaddress", 1, 0, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 1, false);
+      waitForBindings(1, "queues.testaddress", 2, 0, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+      
+      removeConsumer(1);
+      
+      waitForBindings(0, "queues.testaddress", 1, 0, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 0, false);
+      waitForBindings(2, "queues.testaddress", 2, 0, false);
+
+      addConsumer(0, 0, "queue0", null);
+      
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      verifyReceiveAll(20, 0);
+      verifyNotReceive(0);
+   }
+   
+   public void testRedistributionToQueuesWhereNotAllMessagesMatch() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      String filter1 = "giraffe";
+      String filter2 = "platypus";
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);      
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      sendInRange(0, "queues.testaddress", 0, 10, false, filter1);
+      sendInRange(0, "queues.testaddress", 10, 20, false, filter2);
+
+      removeConsumer(0);
+      addConsumer(1, 1, "queue0", filter1);      
+      addConsumer(2, 2, "queue0", filter2);      
+
+      verifyReceiveAllInRange(0, 10, 1);
+      verifyReceiveAllInRange(10, 20, 2);
+   }
+   
+   public void testDelayedRedistribution() throws Exception
+   {
+      final long delay = 1000;
+      setRedistributionDelay(delay);
+      
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);      
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      long start = System.currentTimeMillis();
+      
+      removeConsumer(0);
+      addConsumer(1, 1, "queue0", null);      
+           
+      long minReceiveTime = start + delay;
+      
+      verifyReceiveAllNotBefore(minReceiveTime, 20, 1);
+   }
+   
+   public void testDelayedRedistributionCancelled() throws Exception
+   {
+      final long delay = 1000;
+      setRedistributionDelay(delay);
+      
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);      
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      send(0, "queues.testaddress", 20, false, null);
+
+      removeConsumer(0);
+      addConsumer(1, 1, "queue0", null);     
+      
+      Thread.sleep(delay / 2);
+      
+      //Add it back on the local queue - this should stop any redistributionm
+      addConsumer(0, 0, "queue0", null); 
+      
+      Thread.sleep(delay);
+           
+      verifyReceiveAll(20, 0);
+   }
+   
+   public void testRedistributionNumberOfMessagesGreaterThanBatchSize() throws Exception
+   {
+      setupCluster(false);
+
+      startServers(0, 1, 2);
+
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);      
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 0, true);
+      waitForBindings(2, "queues.testaddress", 1, 0, true);
+
+      waitForBindings(0, "queues.testaddress", 2, 0, false);
+      waitForBindings(1, "queues.testaddress", 2, 1, false);
+      waitForBindings(2, "queues.testaddress", 2, 1, false);
+
+      send(0, "queues.testaddress", QueueImpl.REDISTRIBUTOR_BATCH_SIZE * 2, false, null);
+
+      removeConsumer(0);
+      addConsumer(1, 1, "queue0", null);      
+           
+      verifyReceiveAll(QueueImpl.REDISTRIBUTOR_BATCH_SIZE * 2, 1);
+   }
+
+   protected void setupCluster(final boolean forwardWhenNoConsumers) throws Exception
+   {
+      setupClusterConnection("cluster0", "queues", forwardWhenNoConsumers, 1, isNetty(), 0, 1, 2);
+
+      setupClusterConnection("cluster1", "queues", forwardWhenNoConsumers, 1, isNetty(), 1, 0, 2);
+
+      setupClusterConnection("cluster2", "queues", forwardWhenNoConsumers, 1, isNetty(), 2, 0, 1);
+   }
+
+   protected void setRedistributionDelay(final long delay)
+   {
+      AddressSettings as = new AddressSettings();
+      as.setRedistributionDelay(delay);
+
+      getService(0).getServer().getAddressSettingsRepository().addMatch("queues.*", as);
+      getService(1).getServer().getAddressSettingsRepository().addMatch("queues.*", as);
+      getService(2).getServer().getAddressSettingsRepository().addMatch("queues.*", as);
+   }
+
+   protected void setupServers() throws Exception
+   {
+      setupServer(0, isFileStorage(), isNetty());
+      setupServer(1, isFileStorage(), isNetty());
+      setupServer(2, isFileStorage(), isNetty());
+   }
+
+   protected void stopServers() throws Exception
+   {
+      closeAllConsumers();
+
+      closeAllSessionFactories();
+      
+      stopClusterConnections(0, 1, 2);
+
+      stopServers(0, 1, 2);
+   }
+
+}

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OneWayChainClusterTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OneWayChainClusterTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OneWayChainClusterTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -57,6 +57,8 @@
       
       closeAllSessionFactories();
       
+      stopClusterConnections(0, 1, 2, 3, 4);
+      
       stopServers(0, 1, 2, 3, 4);
       
       super.tearDown();

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OnewayTwoNodeClusterTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OnewayTwoNodeClusterTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/OnewayTwoNodeClusterTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -54,6 +54,8 @@
       
       closeAllSessionFactories();
       
+      stopClusterConnections(0, 1);
+      
       stopServers(0, 1);
       
       super.tearDown();

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/SymmetricClusterTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/SymmetricClusterTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/cluster/distribution/SymmetricClusterTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -42,11 +42,11 @@
    @Override
    protected void setUp() throws Exception
    {
-      super.setUp();     
-      
+      super.setUp();
+
       setupServers();
    }
-   
+
    @Override
    protected void tearDown() throws Exception
    {
@@ -64,7 +64,100 @@
    {
       return false;
    }
+   
+   public void testStopAllStartAll() throws Exception
+   {
+      setupCluster();
 
+      startServers(0, 1, 2, 3, 4);
+      
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+      setupSessionFactory(3, isNetty());
+      setupSessionFactory(4, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+      createQueue(3, "queues.testaddress", "queue0", null, false);
+      createQueue(4, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);
+      addConsumer(1, 1, "queue0", null);
+      addConsumer(2, 2, "queue0", null);
+      addConsumer(3, 3, "queue0", null);
+      addConsumer(4, 4, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+      waitForBindings(3, "queues.testaddress", 1, 1, true);
+      waitForBindings(4, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 4, 4, false);
+      waitForBindings(1, "queues.testaddress", 4, 4, false);
+      waitForBindings(2, "queues.testaddress", 4, 4, false);
+      waitForBindings(3, "queues.testaddress", 4, 4, false);
+      waitForBindings(4, "queues.testaddress", 4, 4, false);
+
+      send(0, "queues.testaddress", 10, false, null);
+
+      verifyReceiveRoundRobinInSomeOrder(10, 0, 1, 2, 3, 4);
+
+      this.verifyNotReceive(0, 1, 2, 3, 4);
+      
+      this.removeConsumer(0);
+      this.removeConsumer(1);
+      this.removeConsumer(2);
+      this.removeConsumer(3);
+      this.removeConsumer(4);
+      
+      this.closeAllSessionFactories();
+      
+      stopServers(0, 1, 2, 3, 4);
+
+      startServers(0, 1, 2, 3, 4);
+      
+      setupSessionFactory(0, isNetty());
+      setupSessionFactory(1, isNetty());
+      setupSessionFactory(2, isNetty());
+      setupSessionFactory(3, isNetty());
+      setupSessionFactory(4, isNetty());
+
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(1, "queues.testaddress", "queue0", null, false);
+      createQueue(2, "queues.testaddress", "queue0", null, false);
+      createQueue(3, "queues.testaddress", "queue0", null, false);
+      createQueue(4, "queues.testaddress", "queue0", null, false);
+
+      addConsumer(0, 0, "queue0", null);
+      addConsumer(1, 1, "queue0", null);
+      addConsumer(2, 2, "queue0", null);
+      addConsumer(3, 3, "queue0", null);
+      addConsumer(4, 4, "queue0", null);
+
+      waitForBindings(0, "queues.testaddress", 1, 1, true);
+      waitForBindings(1, "queues.testaddress", 1, 1, true);
+      waitForBindings(2, "queues.testaddress", 1, 1, true);
+      waitForBindings(3, "queues.testaddress", 1, 1, true);
+      waitForBindings(4, "queues.testaddress", 1, 1, true);
+
+      waitForBindings(0, "queues.testaddress", 4, 4, false);
+      waitForBindings(1, "queues.testaddress", 4, 4, false);
+      waitForBindings(2, "queues.testaddress", 4, 4, false);
+      waitForBindings(3, "queues.testaddress", 4, 4, false);
+      waitForBindings(4, "queues.testaddress", 4, 4, false);
+
+      send(0, "queues.testaddress", 10, false, null);
+
+      verifyReceiveRoundRobinInSomeOrder(10, 0, 1, 2, 3, 4);
+
+      this.verifyNotReceive(0, 1, 2, 3, 4);
+
+      log.info("got here");
+   }
+
    public void testBasicRoundRobin() throws Exception
    {
       setupCluster();
@@ -105,11 +198,11 @@
 
       verifyReceiveRoundRobinInSomeOrder(10, 0, 1, 2, 3, 4);
 
-      verifyNotReceive(0, 1, 2, 3, 4);
-      
+      this.verifyNotReceive(0, 1, 2, 3, 4);
+
       log.info("got here");
    }
-   
+
    public void testRoundRobinMultipleQueues() throws Exception
    {
       setupCluster();
@@ -175,10 +268,8 @@
       verifyReceiveRoundRobinInSomeOrder(10, 0, 1, 2, 3, 4);
       verifyReceiveRoundRobinInSomeOrder(10, 5, 6, 7, 8, 9);
       verifyReceiveRoundRobinInSomeOrder(10, 10, 11, 12, 13, 14);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
-   }
-   
    public void testMultipleNonLoadBalancedQueues() throws Exception
    {
       setupCluster();
@@ -242,10 +333,8 @@
       send(0, "queues.testaddress", 10, false, null);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
-   }
-   
    public void testMixtureLoadBalancedAndNonLoadBalancedQueues() throws Exception
    {
       setupCluster();
@@ -275,25 +364,24 @@
       createQueue(2, "queues.testaddress", "queue12", null, false);
       createQueue(3, "queues.testaddress", "queue13", null, false);
       createQueue(4, "queues.testaddress", "queue14", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue15", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue15", null, false);
       createQueue(1, "queues.testaddress", "queue15", null, false);
       createQueue(2, "queues.testaddress", "queue15", null, false);
       createQueue(3, "queues.testaddress", "queue15", null, false);
       createQueue(4, "queues.testaddress", "queue15", null, false);
-      
-      createQueue(2, "queues.testaddress", "queue16", null, false);      
+
+      createQueue(2, "queues.testaddress", "queue16", null, false);
       createQueue(3, "queues.testaddress", "queue16", null, false);
       createQueue(4, "queues.testaddress", "queue16", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue17", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue17", null, false);
       createQueue(1, "queues.testaddress", "queue17", null, false);
       createQueue(4, "queues.testaddress", "queue17", null, false);
-      
-      createQueue(3, "queues.testaddress", "queue18", null, false);      
+
+      createQueue(3, "queues.testaddress", "queue18", null, false);
       createQueue(4, "queues.testaddress", "queue18", null, false);
-     
-            
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue2", null);
@@ -311,25 +399,24 @@
       addConsumer(12, 2, "queue12", null);
       addConsumer(13, 3, "queue13", null);
       addConsumer(14, 4, "queue14", null);
-      
+
       addConsumer(15, 0, "queue15", null);
       addConsumer(16, 1, "queue15", null);
       addConsumer(17, 2, "queue15", null);
       addConsumer(18, 3, "queue15", null);
       addConsumer(19, 4, "queue15", null);
-      
+
       addConsumer(20, 2, "queue16", null);
       addConsumer(21, 3, "queue16", null);
       addConsumer(22, 4, "queue16", null);
-      
+
       addConsumer(23, 0, "queue17", null);
       addConsumer(24, 1, "queue17", null);
       addConsumer(25, 4, "queue17", null);
-      
+
       addConsumer(26, 3, "queue18", null);
       addConsumer(27, 4, "queue18", null);
 
-     
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 5, 5, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -345,18 +432,16 @@
       send(0, "queues.testaddress", 10, false, null);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 16, 17, 18, 19);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 20, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 26, 27);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-   }
-   
    public void testMixtureLoadBalancedAndNonLoadBalancedQueuesRemoveSomeQueuesAndConsumers() throws Exception
    {
       setupCluster();
@@ -386,25 +471,24 @@
       createQueue(2, "queues.testaddress", "queue12", null, false);
       createQueue(3, "queues.testaddress", "queue13", null, false);
       createQueue(4, "queues.testaddress", "queue14", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue15", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue15", null, false);
       createQueue(1, "queues.testaddress", "queue15", null, false);
       createQueue(2, "queues.testaddress", "queue15", null, false);
       createQueue(3, "queues.testaddress", "queue15", null, false);
       createQueue(4, "queues.testaddress", "queue15", null, false);
-      
-      createQueue(2, "queues.testaddress", "queue16", null, false);      
+
+      createQueue(2, "queues.testaddress", "queue16", null, false);
       createQueue(3, "queues.testaddress", "queue16", null, false);
       createQueue(4, "queues.testaddress", "queue16", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue17", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue17", null, false);
       createQueue(1, "queues.testaddress", "queue17", null, false);
       createQueue(4, "queues.testaddress", "queue17", null, false);
-      
-      createQueue(3, "queues.testaddress", "queue18", null, false);      
+
+      createQueue(3, "queues.testaddress", "queue18", null, false);
       createQueue(4, "queues.testaddress", "queue18", null, false);
-     
-            
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue2", null);
@@ -422,25 +506,24 @@
       addConsumer(12, 2, "queue12", null);
       addConsumer(13, 3, "queue13", null);
       addConsumer(14, 4, "queue14", null);
-      
+
       addConsumer(15, 0, "queue15", null);
       addConsumer(16, 1, "queue15", null);
       addConsumer(17, 2, "queue15", null);
       addConsumer(18, 3, "queue15", null);
       addConsumer(19, 4, "queue15", null);
-      
+
       addConsumer(20, 2, "queue16", null);
       addConsumer(21, 3, "queue16", null);
       addConsumer(22, 4, "queue16", null);
-      
+
       addConsumer(23, 0, "queue17", null);
       addConsumer(24, 1, "queue17", null);
       addConsumer(25, 4, "queue17", null);
-      
+
       addConsumer(26, 3, "queue18", null);
       addConsumer(27, 4, "queue18", null);
 
-     
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 5, 5, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -456,31 +539,29 @@
       send(0, "queues.testaddress", 10, false, null);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 16, 17, 18, 19);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 20, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 26, 27);
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-      
       removeConsumer(16);
       removeConsumer(18);
       removeConsumer(21);
       removeConsumer(22);
       removeConsumer(26);
-      
+
       deleteQueue(1, "queue15");
       deleteQueue(3, "queue15");
-      
+
       deleteQueue(3, "queue16");
       deleteQueue(4, "queue16");
-      
+
       deleteQueue(3, "queue18");
-      
+
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 4, 4, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -492,21 +573,16 @@
       waitForBindings(2, "queues.testaddress", 18, 18, false);
       waitForBindings(3, "queues.testaddress", 20, 20, false);
       waitForBindings(4, "queues.testaddress", 17, 17, false);
-      
+
       send(0, "queues.testaddress", 10, false, null);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 20, 27);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 17, 19);
-      
-      //this.checkReceive(23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 20, 23, 24, 25, 27);
-      
    }
-   
+
    public void testMixtureLoadBalancedAndNonLoadBalancedQueuesAddQueuesAndConsumersBeforAllServersAreStarted() throws Exception
    {
       setupCluster();
@@ -518,86 +594,85 @@
       createQueue(0, "queues.testaddress", "queue0", null, false);
       createQueue(0, "queues.testaddress", "queue5", null, false);
       createQueue(0, "queues.testaddress", "queue10", null, false);
-      createQueue(0, "queues.testaddress", "queue15", null, false);  
-      createQueue(0, "queues.testaddress", "queue17", null, false);  
-      
+      createQueue(0, "queues.testaddress", "queue15", null, false);
+      createQueue(0, "queues.testaddress", "queue17", null, false);
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(5, 0, "queue5", null);
-      
+
       startServers(1);
       setupSessionFactory(1, isNetty());
-      
+
       createQueue(1, "queues.testaddress", "queue1", null, false);
       createQueue(1, "queues.testaddress", "queue6", null, false);
       createQueue(1, "queues.testaddress", "queue11", null, false);
       createQueue(1, "queues.testaddress", "queue15", null, false);
       createQueue(1, "queues.testaddress", "queue17", null, false);
-      
+
       addConsumer(1, 1, "queue1", null);
       addConsumer(6, 1, "queue6", null);
       addConsumer(11, 1, "queue11", null);
       addConsumer(16, 1, "queue15", null);
-      
+
       startServers(2);
       setupSessionFactory(2, isNetty());
-      
+
       createQueue(2, "queues.testaddress", "queue2", null, false);
       createQueue(2, "queues.testaddress", "queue7", null, false);
       createQueue(2, "queues.testaddress", "queue12", null, false);
       createQueue(2, "queues.testaddress", "queue15", null, false);
-      createQueue(2, "queues.testaddress", "queue16", null, false);  
-      
+      createQueue(2, "queues.testaddress", "queue16", null, false);
+
       addConsumer(2, 2, "queue2", null);
       addConsumer(7, 2, "queue7", null);
       addConsumer(12, 2, "queue12", null);
       addConsumer(17, 2, "queue15", null);
-      
+
       startServers(3);
       setupSessionFactory(3, isNetty());
-      
+
       createQueue(3, "queues.testaddress", "queue3", null, false);
       createQueue(3, "queues.testaddress", "queue8", null, false);
       createQueue(3, "queues.testaddress", "queue13", null, false);
       createQueue(3, "queues.testaddress", "queue15", null, false);
       createQueue(3, "queues.testaddress", "queue16", null, false);
       createQueue(3, "queues.testaddress", "queue18", null, false);
-      
+
       addConsumer(3, 3, "queue3", null);
       addConsumer(8, 3, "queue8", null);
       addConsumer(13, 3, "queue13", null);
       addConsumer(18, 3, "queue15", null);
-      
+
       startServers(4);
       setupSessionFactory(4, isNetty());
-      
+
       createQueue(4, "queues.testaddress", "queue4", null, false);
       createQueue(4, "queues.testaddress", "queue9", null, false);
       createQueue(4, "queues.testaddress", "queue14", null, false);
       createQueue(4, "queues.testaddress", "queue15", null, false);
       createQueue(4, "queues.testaddress", "queue16", null, false);
-      createQueue(4, "queues.testaddress", "queue17", null, false); 
+      createQueue(4, "queues.testaddress", "queue17", null, false);
       createQueue(4, "queues.testaddress", "queue18", null, false);
-     
+
       addConsumer(4, 4, "queue4", null);
       addConsumer(9, 4, "queue9", null);
       addConsumer(10, 0, "queue10", null);
-      addConsumer(14, 4, "queue14", null);  
-      
+      addConsumer(14, 4, "queue14", null);
+
       addConsumer(15, 0, "queue15", null);
-      addConsumer(19, 4, "queue15", null); 
-      
+      addConsumer(19, 4, "queue15", null);
+
       addConsumer(20, 2, "queue16", null);
       addConsumer(21, 3, "queue16", null);
       addConsumer(22, 4, "queue16", null);
-      
+
       addConsumer(23, 0, "queue17", null);
       addConsumer(24, 1, "queue17", null);
       addConsumer(25, 4, "queue17", null);
-      
+
       addConsumer(26, 3, "queue18", null);
       addConsumer(27, 4, "queue18", null);
 
-     
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 5, 5, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -613,18 +688,16 @@
       send(0, "queues.testaddress", 10, false, null);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 16, 17, 18, 19);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 20, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 26, 27);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-   }
-   
    public void testMixtureLoadBalancedAndNonLoadBalancedQueuesWithFilters() throws Exception
    {
       setupCluster();
@@ -636,8 +709,8 @@
       setupSessionFactory(2, isNetty());
       setupSessionFactory(3, isNetty());
       setupSessionFactory(4, isNetty());
-      
-      String filter1 = "haggis";      
+
+      String filter1 = "haggis";
       String filter2 = "scotch-egg";
 
       createQueue(0, "queues.testaddress", "queue0", null, false);
@@ -657,25 +730,24 @@
       createQueue(2, "queues.testaddress", "queue12", null, false);
       createQueue(3, "queues.testaddress", "queue13", null, false);
       createQueue(4, "queues.testaddress", "queue14", filter1, false);
-      
-      createQueue(0, "queues.testaddress", "queue15", filter1, false);      
+
+      createQueue(0, "queues.testaddress", "queue15", filter1, false);
       createQueue(1, "queues.testaddress", "queue15", filter1, false);
       createQueue(2, "queues.testaddress", "queue15", null, false);
       createQueue(3, "queues.testaddress", "queue15", filter2, false);
       createQueue(4, "queues.testaddress", "queue15", filter2, false);
-      
-      createQueue(2, "queues.testaddress", "queue16", filter1, false);      
+
+      createQueue(2, "queues.testaddress", "queue16", filter1, false);
       createQueue(3, "queues.testaddress", "queue16", null, false);
       createQueue(4, "queues.testaddress", "queue16", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue17", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue17", null, false);
       createQueue(1, "queues.testaddress", "queue17", null, false);
       createQueue(4, "queues.testaddress", "queue17", null, false);
-      
-      createQueue(3, "queues.testaddress", "queue18", filter2, false);      
+
+      createQueue(3, "queues.testaddress", "queue18", filter2, false);
       createQueue(4, "queues.testaddress", "queue18", null, false);
-     
-            
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue2", null);
@@ -693,25 +765,24 @@
       addConsumer(12, 2, "queue12", null);
       addConsumer(13, 3, "queue13", null);
       addConsumer(14, 4, "queue14", null);
-      
+
       addConsumer(15, 0, "queue15", null);
       addConsumer(16, 1, "queue15", null);
       addConsumer(17, 2, "queue15", null);
       addConsumer(18, 3, "queue15", null);
       addConsumer(19, 4, "queue15", null);
-      
+
       addConsumer(20, 2, "queue16", null);
       addConsumer(21, 3, "queue16", null);
       addConsumer(22, 4, "queue16", null);
-      
+
       addConsumer(23, 0, "queue17", null);
       addConsumer(24, 1, "queue17", null);
       addConsumer(25, 4, "queue17", null);
-      
+
       addConsumer(26, 3, "queue18", null);
       addConsumer(27, 4, "queue18", null);
 
-     
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 5, 5, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -727,38 +798,32 @@
       send(0, "queues.testaddress", 10, false, filter1);
 
       verifyReceiveAll(10, 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 27);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 16, 17);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 20, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-      
+
       send(0, "queues.testaddress", 10, false, filter2);
-      
+
       verifyReceiveAll(10, 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 17, 18, 19);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 26, 27);
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-      
       send(0, "queues.testaddress", 10, false, null);
-            
+
       verifyReceiveAll(10, 0, 2, 4, 6, 8, 10, 12, 13, 17, 27);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
    }
 
    public void testMixtureLoadBalancedAndNonLoadBalancedQueuesWithConsumersWithFilters() throws Exception
@@ -772,8 +837,8 @@
       setupSessionFactory(2, isNetty());
       setupSessionFactory(3, isNetty());
       setupSessionFactory(4, isNetty());
-      
-      String filter1 = "haggis";      
+
+      String filter1 = "haggis";
       String filter2 = "scotch-egg";
 
       createQueue(0, "queues.testaddress", "queue0", null, false);
@@ -793,25 +858,24 @@
       createQueue(2, "queues.testaddress", "queue12", null, false);
       createQueue(3, "queues.testaddress", "queue13", null, false);
       createQueue(4, "queues.testaddress", "queue14", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue15", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue15", null, false);
       createQueue(1, "queues.testaddress", "queue15", null, false);
       createQueue(2, "queues.testaddress", "queue15", null, false);
       createQueue(3, "queues.testaddress", "queue15", null, false);
       createQueue(4, "queues.testaddress", "queue15", null, false);
-      
-      createQueue(2, "queues.testaddress", "queue16", null, false);      
+
+      createQueue(2, "queues.testaddress", "queue16", null, false);
       createQueue(3, "queues.testaddress", "queue16", null, false);
       createQueue(4, "queues.testaddress", "queue16", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue17", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue17", null, false);
       createQueue(1, "queues.testaddress", "queue17", null, false);
       createQueue(4, "queues.testaddress", "queue17", null, false);
-      
-      createQueue(3, "queues.testaddress", "queue18", filter2, false);      
+
+      createQueue(3, "queues.testaddress", "queue18", filter2, false);
       createQueue(4, "queues.testaddress", "queue18", null, false);
-     
-            
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue1", filter1);
       addConsumer(2, 2, "queue2", null);
@@ -829,25 +893,24 @@
       addConsumer(12, 2, "queue12", null);
       addConsumer(13, 3, "queue13", null);
       addConsumer(14, 4, "queue14", filter1);
-      
+
       addConsumer(15, 0, "queue15", filter1);
       addConsumer(16, 1, "queue15", filter1);
       addConsumer(17, 2, "queue15", null);
       addConsumer(18, 3, "queue15", filter2);
       addConsumer(19, 4, "queue15", filter2);
-      
+
       addConsumer(20, 2, "queue16", filter1);
       addConsumer(21, 3, "queue16", null);
       addConsumer(22, 4, "queue16", null);
-      
+
       addConsumer(23, 0, "queue17", null);
       addConsumer(24, 1, "queue17", null);
       addConsumer(25, 4, "queue17", null);
-      
+
       addConsumer(26, 3, "queue18", filter2);
       addConsumer(27, 4, "queue18", null);
 
-     
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 5, 5, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -863,40 +926,34 @@
       send(0, "queues.testaddress", 10, false, filter1);
 
       verifyReceiveAll(10, 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 27);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 16, 17);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 20, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-      
+
       send(0, "queues.testaddress", 10, false, filter2);
-      
+
       verifyReceiveAll(10, 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 17, 18, 19);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 26, 27);
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);    
-      
       send(0, "queues.testaddress", 10, false, null);
-      
+
       verifyReceiveAll(10, 0, 2, 4, 6, 8, 10, 12, 13, 17, 27);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
    }
-   
+
    public void testRouteWhenNoConsumersTrueLoadBalancedQueues() throws Exception
    {
       setupCluster(true);
@@ -928,7 +985,7 @@
       waitForBindings(4, "queues.testaddress", 4, 0, false);
 
       send(0, "queues.testaddress", 10, false, null);
-      
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue0", null);
       addConsumer(2, 2, "queue0", null);
@@ -948,10 +1005,8 @@
       waitForBindings(4, "queues.testaddress", 4, 4, false);
 
       verifyReceiveRoundRobinInSomeOrder(10, 0, 1, 2, 3, 4);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4);
-   }
-   
    public void testRouteWhenNoConsumersFalseNoLocalConsumerLoadBalancedQueues() throws Exception
    {
       setupCluster(false);
@@ -983,7 +1038,7 @@
       waitForBindings(4, "queues.testaddress", 4, 0, false);
 
       send(0, "queues.testaddress", 10, false, null);
-      
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue0", null);
       addConsumer(2, 2, "queue0", null);
@@ -1002,13 +1057,11 @@
       waitForBindings(3, "queues.testaddress", 4, 4, false);
       waitForBindings(4, "queues.testaddress", 4, 4, false);
 
-      //Should still be round robined since no local consumer
-      
+      // Should still be round robined since no local consumer
+
       verifyReceiveRoundRobinInSomeOrder(10, 0, 1, 2, 3, 4);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4);
-   }
-   
    public void testRouteWhenNoConsumersFalseLocalConsumerLoadBalancedQueues() throws Exception
    {
       setupCluster(false);
@@ -1026,7 +1079,7 @@
       createQueue(2, "queues.testaddress", "queue0", null, false);
       createQueue(3, "queues.testaddress", "queue0", null, false);
       createQueue(4, "queues.testaddress", "queue0", null, false);
-      
+
       addConsumer(0, 0, "queue0", null);
 
       waitForBindings(0, "queues.testaddress", 1, 1, true);
@@ -1042,7 +1095,7 @@
       waitForBindings(4, "queues.testaddress", 4, 1, false);
 
       send(0, "queues.testaddress", 10, false, null);
-            
+
       addConsumer(1, 1, "queue0", null);
       addConsumer(2, 2, "queue0", null);
       addConsumer(3, 3, "queue0", null);
@@ -1061,10 +1114,8 @@
       waitForBindings(4, "queues.testaddress", 4, 4, false);
 
       verifyReceiveAll(10, 0);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4);
-   }
-   
    public void testRouteWhenNoConsumersFalseNonLoadBalancedQueues() throws Exception
    {
       setupCluster(false);
@@ -1096,7 +1147,7 @@
       waitForBindings(4, "queues.testaddress", 4, 0, false);
 
       send(0, "queues.testaddress", 10, false, null);
-      
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue2", null);
@@ -1116,10 +1167,8 @@
       waitForBindings(4, "queues.testaddress", 4, 4, false);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4);
-   }
-   
    public void testRouteWhenNoConsumersTrueNonLoadBalancedQueues() throws Exception
    {
       setupCluster(true);
@@ -1151,7 +1200,7 @@
       waitForBindings(4, "queues.testaddress", 4, 0, false);
 
       send(0, "queues.testaddress", 10, false, null);
-      
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue2", null);
@@ -1171,88 +1220,82 @@
       waitForBindings(4, "queues.testaddress", 4, 4, false);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4);
-   }
-   
    public void testNoLocalQueueNonLoadBalancedQueues() throws Exception
    {
       setupCluster(true);
 
       startServers(0, 1, 2, 3, 4);
-      
+
       setupSessionFactory(0, isNetty());
       setupSessionFactory(1, isNetty());
       setupSessionFactory(2, isNetty());
       setupSessionFactory(3, isNetty());
       setupSessionFactory(4, isNetty());
-     
+
       createQueue(1, "queues.testaddress", "queue1", null, false);
       createQueue(2, "queues.testaddress", "queue2", null, false);
       createQueue(3, "queues.testaddress", "queue3", null, false);
       createQueue(4, "queues.testaddress", "queue4", null, false);
-      
+
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue2", null);
       addConsumer(3, 3, "queue3", null);
       addConsumer(4, 4, "queue4", null);
-     
+
       waitForBindings(1, "queues.testaddress", 1, 1, true);
       waitForBindings(2, "queues.testaddress", 1, 1, true);
       waitForBindings(3, "queues.testaddress", 1, 1, true);
       waitForBindings(4, "queues.testaddress", 1, 1, true);
-     
+
       waitForBindings(1, "queues.testaddress", 3, 3, false);
       waitForBindings(2, "queues.testaddress", 3, 3, false);
       waitForBindings(3, "queues.testaddress", 3, 3, false);
       waitForBindings(4, "queues.testaddress", 3, 3, false);
 
       send(0, "queues.testaddress", 10, false, null);
-                
+
       verifyReceiveAll(10, 1, 2, 3, 4);
+   }
 
-      verifyNotReceive(1, 2, 3, 4);
-   }
-   
    public void testNoLocalQueueLoadBalancedQueues() throws Exception
    {
       setupCluster(true);
 
       startServers(0, 1, 2, 3, 4);
-      
+
       setupSessionFactory(0, isNetty());
       setupSessionFactory(1, isNetty());
       setupSessionFactory(2, isNetty());
       setupSessionFactory(3, isNetty());
       setupSessionFactory(4, isNetty());
-     
+
       createQueue(1, "queues.testaddress", "queue1", null, false);
       createQueue(2, "queues.testaddress", "queue1", null, false);
       createQueue(3, "queues.testaddress", "queue1", null, false);
       createQueue(4, "queues.testaddress", "queue1", null, false);
-      
+
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue1", null);
       addConsumer(3, 3, "queue1", null);
       addConsumer(4, 4, "queue1", null);
-     
+
       waitForBindings(1, "queues.testaddress", 1, 1, true);
       waitForBindings(2, "queues.testaddress", 1, 1, true);
       waitForBindings(3, "queues.testaddress", 1, 1, true);
       waitForBindings(4, "queues.testaddress", 1, 1, true);
-     
+
       waitForBindings(1, "queues.testaddress", 3, 3, false);
       waitForBindings(2, "queues.testaddress", 3, 3, false);
       waitForBindings(3, "queues.testaddress", 3, 3, false);
       waitForBindings(4, "queues.testaddress", 3, 3, false);
 
       send(0, "queues.testaddress", 10, false, null);
-                
+
       verifyReceiveRoundRobinInSomeOrder(10, 1, 2, 3, 4);
+   }
 
-      verifyNotReceive(1, 2, 3, 4);
-   }
-   
    public void testStartStopServers() throws Exception
    {
       setupCluster();
@@ -1282,25 +1325,24 @@
       createQueue(2, "queues.testaddress", "queue12", null, false);
       createQueue(3, "queues.testaddress", "queue13", null, false);
       createQueue(4, "queues.testaddress", "queue14", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue15", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue15", null, false);
       createQueue(1, "queues.testaddress", "queue15", null, false);
       createQueue(2, "queues.testaddress", "queue15", null, false);
       createQueue(3, "queues.testaddress", "queue15", null, false);
       createQueue(4, "queues.testaddress", "queue15", null, false);
-      
-      createQueue(2, "queues.testaddress", "queue16", null, false);      
+
+      createQueue(2, "queues.testaddress", "queue16", null, false);
       createQueue(3, "queues.testaddress", "queue16", null, false);
       createQueue(4, "queues.testaddress", "queue16", null, false);
-      
-      createQueue(0, "queues.testaddress", "queue17", null, false);      
+
+      createQueue(0, "queues.testaddress", "queue17", null, false);
       createQueue(1, "queues.testaddress", "queue17", null, false);
       createQueue(4, "queues.testaddress", "queue17", null, false);
-      
-      createQueue(3, "queues.testaddress", "queue18", null, false);      
+
+      createQueue(3, "queues.testaddress", "queue18", null, false);
       createQueue(4, "queues.testaddress", "queue18", null, false);
-     
-            
+
       addConsumer(0, 0, "queue0", null);
       addConsumer(1, 1, "queue1", null);
       addConsumer(2, 2, "queue2", null);
@@ -1318,25 +1360,24 @@
       addConsumer(12, 2, "queue12", null);
       addConsumer(13, 3, "queue13", null);
       addConsumer(14, 4, "queue14", null);
-      
+
       addConsumer(15, 0, "queue15", null);
       addConsumer(16, 1, "queue15", null);
       addConsumer(17, 2, "queue15", null);
       addConsumer(18, 3, "queue15", null);
       addConsumer(19, 4, "queue15", null);
-      
+
       addConsumer(20, 2, "queue16", null);
       addConsumer(21, 3, "queue16", null);
       addConsumer(22, 4, "queue16", null);
-      
+
       addConsumer(23, 0, "queue17", null);
       addConsumer(24, 1, "queue17", null);
       addConsumer(25, 4, "queue17", null);
-      
+
       addConsumer(26, 3, "queue18", null);
       addConsumer(27, 4, "queue18", null);
 
-     
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 5, 5, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -1352,17 +1393,15 @@
       send(0, "queues.testaddress", 10, false, null);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 16, 17, 18, 19);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 20, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 26, 27);
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-      
       removeConsumer(0);
       removeConsumer(5);
       removeConsumer(10);
@@ -1374,54 +1413,53 @@
       removeConsumer(18);
       removeConsumer(21);
       removeConsumer(26);
-      
+
       closeSessionFactory(0);
       closeSessionFactory(3);
-            
+
       stopServers(0, 3);
-      
+
       startServers(3, 0);
-      
+
       setupSessionFactory(0, isNetty());
       setupSessionFactory(3, isNetty());
-      
-      createQueue(0, "queues.testaddress", "queue0", null, false);     
-      createQueue(3, "queues.testaddress", "queue3", null, false);      
 
-      createQueue(0, "queues.testaddress", "queue5", null, false);     
-      createQueue(3, "queues.testaddress", "queue8", null, false);     
+      createQueue(0, "queues.testaddress", "queue0", null, false);
+      createQueue(3, "queues.testaddress", "queue3", null, false);
 
-      createQueue(0, "queues.testaddress", "queue10", null, false);     
-      createQueue(3, "queues.testaddress", "queue13", null, false);     
-      
-      createQueue(0, "queues.testaddress", "queue15", null, false);           
-      createQueue(3, "queues.testaddress", "queue15", null, false);     
-          
-      createQueue(3, "queues.testaddress", "queue16", null, false);    
-      
-      createQueue(0, "queues.testaddress", "queue17", null, false);           
-      
-      createQueue(3, "queues.testaddress", "queue18", null, false);           
-     
-            
-      addConsumer(0, 0, "queue0", null);    
-      addConsumer(3, 3, "queue3", null);    
+      createQueue(0, "queues.testaddress", "queue5", null, false);
+      createQueue(3, "queues.testaddress", "queue8", null, false);
 
-      addConsumer(5, 0, "queue5", null);     
-      addConsumer(8, 3, "queue8", null);     
+      createQueue(0, "queues.testaddress", "queue10", null, false);
+      createQueue(3, "queues.testaddress", "queue13", null, false);
 
-      addConsumer(10, 0, "queue10", null);     
+      createQueue(0, "queues.testaddress", "queue15", null, false);
+      createQueue(3, "queues.testaddress", "queue15", null, false);
+
+      createQueue(3, "queues.testaddress", "queue16", null, false);
+
+      createQueue(0, "queues.testaddress", "queue17", null, false);
+
+      createQueue(3, "queues.testaddress", "queue18", null, false);
+
+      addConsumer(0, 0, "queue0", null);
+      addConsumer(3, 3, "queue3", null);
+
+      addConsumer(5, 0, "queue5", null);
+      addConsumer(8, 3, "queue8", null);
+
+      addConsumer(10, 0, "queue10", null);
       addConsumer(13, 3, "queue13", null);
-           
-      addConsumer(15, 0, "queue15", null);     
+
+      addConsumer(15, 0, "queue15", null);
       addConsumer(18, 3, "queue15", null);
-    
-      addConsumer(21, 3, "queue16", null);     
-      
-      addConsumer(23, 0, "queue17", null);      
-      
-      addConsumer(26, 3, "queue18", null);     
-      
+
+      addConsumer(21, 3, "queue16", null);
+
+      addConsumer(23, 0, "queue17", null);
+
+      addConsumer(26, 3, "queue18", null);
+
       waitForBindings(0, "queues.testaddress", 5, 5, true);
       waitForBindings(1, "queues.testaddress", 5, 5, true);
       waitForBindings(2, "queues.testaddress", 5, 5, true);
@@ -1437,23 +1475,21 @@
       send(0, "queues.testaddress", 10, false, null);
 
       verifyReceiveAll(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 15, 16, 17, 18, 19);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 20, 21, 22);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 23, 24, 25);
-      
+
       verifyReceiveRoundRobinInSomeOrder(10, 26, 27);
+   }
 
-      verifyNotReceive(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27);
-   }
-         
    protected void setupCluster() throws Exception
    {
       setupCluster(false);
    }
-   
+
    protected void setupCluster(final boolean forwardWhenNoConsumers) throws Exception
    {
       setupClusterConnection("cluster0", "queues", forwardWhenNoConsumers, 1, isNetty(), 0, 1, 2, 3, 4);
@@ -1466,51 +1502,26 @@
 
       setupClusterConnection("cluster4", "queues", forwardWhenNoConsumers, 1, isNetty(), 4, 0, 1, 2, 3);
    }
-   
+
    protected void setupServers() throws Exception
    {
       setupServer(0, isFileStorage(), isNetty());
       setupServer(1, isFileStorage(), isNetty());
       setupServer(2, isFileStorage(), isNetty());
       setupServer(3, isFileStorage(), isNetty());
-      setupServer(4, isFileStorage(), isNetty());  
+      setupServer(4, isFileStorage(), isNetty());
    }
-   
+
    protected void stopServers() throws Exception
    {
       closeAllConsumers();
 
       closeAllSessionFactories();
 
+      // We stop the cluster connections first since this makes server shutdown quicker
+      stopClusterConnections(0, 1, 2, 3, 4);
+
       stopServers(0, 1, 2, 3, 4);
    }
-   
-//   private void setupCluster(final boolean forwardWhenNoConsumers) throws Exception
-//   {
-//      setupClusterConnection("cluster0-1", 0, 1, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster0-2", 0, 2, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster0-3", 0, 3, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster0-4", 0, 4, "queues", forwardWhenNoConsumers, 1, isNetty());
-//
-//      setupClusterConnection("cluster1-0", 1, 0, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster1-2", 1, 2, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster1-3", 1, 3, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster1-4", 1, 4, "queues", forwardWhenNoConsumers, 1, isNetty());
-//
-//      setupClusterConnection("cluster2-0", 2, 0, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster2-1", 2, 1, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster2-3", 2, 3, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster2-4", 2, 4, "queues", forwardWhenNoConsumers, 1, isNetty());
-//
-//      setupClusterConnection("cluster3-0", 3, 0, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster3-1", 3, 1, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster3-2", 3, 2, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster3-4", 3, 4, "queues", forwardWhenNoConsumers, 1, isNetty());
-//
-//      setupClusterConnection("cluster4-0", 4, 0, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster4-1", 4, 1, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster4-2", 4, 2, "queues", forwardWhenNoConsumers, 1, isNetty());
-//      setupClusterConnection("cluster4-3", 4, 3, "queues", forwardWhenNoConsumers, 1, isNetty());
-//   }
-   
+
 }

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/MultiThreadRandomFailoverTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/MultiThreadRandomFailoverTestBase.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/MultiThreadRandomFailoverTestBase.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -231,7 +231,7 @@
          {
             doTestL(sf);
          }
-      }, 1, false, true);
+      }, NUM_THREADS, false, true, 10);
    }
 
    // public void testM() throws Exception
@@ -1036,7 +1036,9 @@
 
       message2.acknowledge();
 
+      log.info("** closing session");
       sess.close();
+      log.info("** closed session");
 
       sessCreate.deleteQueue(new SimpleString(threadNum + ADDRESS.toString()));
 
@@ -1068,21 +1070,16 @@
     */
    protected void doTestL(final ClientSessionFactory sf) throws Exception
    {     
-      ClientSessionFactoryInternal sf2 = createSessionFactory();
-      
       final int numSessions = 10;
 
       for (int i = 0; i < numSessions; i++)
       {
          log.info("i " + i);
-         ClientSession session = sf2.createSession(false, false, false);
+         
+         ClientSession session = sf.createSession(false, false, false);
 
          session.close();
-         
-         Thread.sleep(10);
-      }
- 
-      sf2.close();     
+      }   
    }
 
    // Browsers
@@ -1289,6 +1286,11 @@
    
    private void runTestMultipleThreads(final RunnableT runnable, final int numThreads, final boolean fileBased, final boolean failOnCreateConnection) throws Exception
    {
+      this.runTestMultipleThreads(runnable, numThreads, fileBased, failOnCreateConnection, 1000);
+   }
+   
+   private void runTestMultipleThreads(final RunnableT runnable, final int numThreads, final boolean fileBased, final boolean failOnCreateConnection, final long failDelay) throws Exception
+   {
       final int numIts = getNumIterations();
 
       for (int its = 0; its < numIts; its++)
@@ -1301,7 +1303,7 @@
 
          ClientSession session = sf.createSession(false, false, false);
 
-         Failer failer = startFailer(1000, session, failOnCreateConnection);
+         Failer failer = startFailer(failDelay, session, failOnCreateConnection);
 
          class Runner extends Thread
          {

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/RandomFailoverTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/RandomFailoverTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/cluster/failover/RandomFailoverTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -36,7 +36,6 @@
 import org.jboss.messaging.core.config.impl.ConfigurationImpl;
 import org.jboss.messaging.core.exception.MessagingException;
 import org.jboss.messaging.core.logging.Logger;
-import org.jboss.messaging.core.remoting.impl.invm.InVMConnector;
 import org.jboss.messaging.core.remoting.impl.invm.InVMRegistry;
 import org.jboss.messaging.core.remoting.impl.invm.TransportConstants;
 import org.jboss.messaging.core.server.Messaging;
@@ -1369,19 +1368,17 @@
    }
 
    protected void doTestL(final ClientSessionFactory sf) throws Exception
-   {
-      ClientSession s = sf.createSession(false, false, false);
+   {     
+      final int numSessions = 10;
 
-      final int numSessions = 100;
-
       for (int i = 0; i < numSessions; i++)
       {
+         log.info("i " + i);
+         
          ClientSession session = sf.createSession(false, false, false);
 
          session.close();
-      }
-
-      s.close();
+      }   
    }
 
    protected void doTestN(final ClientSessionFactory sf) throws Exception
@@ -1432,7 +1429,7 @@
 
    protected int getNumIterations()
    {
-      return 1;
+      return 2;
    }
 
    protected void setUp() throws Exception

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/paging/PageCrashTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/paging/PageCrashTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/paging/PageCrashTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -88,7 +88,6 @@
 
    public void testCrashDuringDeleteFile() throws Exception
    {
-
       pageAndFail();
 
       File pageDir = new File(getPageDir());

Modified: trunk/tests/src/org/jboss/messaging/tests/performance/persistence/FakePostOffice.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/performance/persistence/FakePostOffice.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/performance/persistence/FakePostOffice.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -48,6 +48,12 @@
  */
 public class FakePostOffice implements PostOffice
 {
+   public boolean redistribute(ServerMessage message, SimpleString routingName, Transaction tx) throws Exception
+   {
+      // TODO Auto-generated method stub
+      return false;
+   }
+
    public void sendQueueInfoToQueue(SimpleString queueName, SimpleString address) throws Exception
    {
       // TODO Auto-generated method stub

Modified: trunk/tests/src/org/jboss/messaging/tests/stress/failover/LargeMessageMultiThreadFailoverStressTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/stress/failover/LargeMessageMultiThreadFailoverStressTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/stress/failover/LargeMessageMultiThreadFailoverStressTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -50,7 +50,7 @@
    
    protected int getNumIterations()
    {
-      return 20;
+      return 50;
    }
 
 

Modified: trunk/tests/src/org/jboss/messaging/tests/stress/failover/MultiThreadRandomFailoverStressTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/stress/failover/MultiThreadRandomFailoverStressTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/stress/failover/MultiThreadRandomFailoverStressTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -24,7 +24,7 @@
 {
    protected int getNumIterations()
    {
-      return 20;
+      return 50;
    }
 
 }

Modified: trunk/tests/src/org/jboss/messaging/tests/stress/failover/RandomFailoverStressTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/stress/failover/RandomFailoverStressTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/stress/failover/RandomFailoverStressTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -53,7 +53,7 @@
    
    protected int getNumIterations()
    {
-      return 20;
+      return 50;
    }
 
    // Private -------------------------------------------------------

Modified: trunk/tests/src/org/jboss/messaging/tests/timing/core/server/impl/QueueImplTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/timing/core/server/impl/QueueImplTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/timing/core/server/impl/QueueImplTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -69,12 +69,12 @@
 
    // The tests ----------------------------------------------------------------
 
-   public void testScheduledDirect()
+   public void testScheduledDirect()  throws Exception
    {
       testScheduled(true);
    }
 
-   public void testScheduledQueueing()
+   public void testScheduledQueueing()  throws Exception
    {
       testScheduled(false);
    }
@@ -145,7 +145,7 @@
       assertRefListsIdenticalRefs(refs, consumer.getReferences());
    }
 
-   private void testScheduled(boolean direct)
+   private void testScheduled(boolean direct) throws Exception
    {
       Queue queue = new QueueImpl(1,new SimpleString("address1"), new SimpleString("queue1"), null, false, true, scheduledExecutor, null, null, null);
 

Modified: trunk/tests/src/org/jboss/messaging/tests/unit/core/deployers/impl/AddressSettingsDeployerTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/deployers/impl/AddressSettingsDeployerTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/deployers/impl/AddressSettingsDeployerTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -62,7 +62,6 @@
    public void testDeploy() throws Exception
    {
       final AddressSettings addressSettings = new AddressSettings();
-      addressSettings.setClustered(false);
       addressSettings.setRedeliveryDelay((long) 100);
       addressSettings.setMaxSizeBytes(-100);
       addressSettings.setDistributionPolicyClass("org.jboss.messaging.core.impl.RoundRobinDistributionPolicy");
@@ -76,7 +75,6 @@
          public Object answer() throws Throwable
          {
             AddressSettings q = (AddressSettings) EasyMock.getCurrentArguments()[1];
-            assertFalse(q.isClustered());
             assertEquals(q.getRedeliveryDelay(), addressSettings.getRedeliveryDelay());
             assertEquals(q.getMaxSizeBytes(), addressSettings.getMaxSizeBytes());
             assertEquals(q.getDistributionPolicyClass(), addressSettings.getDistributionPolicyClass());

Modified: trunk/tests/src/org/jboss/messaging/tests/unit/core/journal/impl/JournalImplTestUnit.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/journal/impl/JournalImplTestUnit.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/journal/impl/JournalImplTestUnit.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -3018,6 +3018,7 @@
       assertEquals(0, journal.getDataFilesCount());
    }
 
+
    protected abstract int getAlignment();
 
 }

Modified: trunk/tests/src/org/jboss/messaging/tests/unit/core/management/impl/QueueControlTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/management/impl/QueueControlTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/management/impl/QueueControlTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -636,7 +636,7 @@
 
    private QueueControl createControl() throws Exception
    {
-      return new QueueControl(queue, storageManager, postOffice, repository, messageCounter);
+      return new QueueControl(queue, postOffice, repository, messageCounter);
    }
 
    // Inner classes -------------------------------------------------

Modified: trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueFactoryImplTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueFactoryImplTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueFactoryImplTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -46,7 +46,6 @@
       StorageManager sm = EasyMock.createStrictMock(StorageManager.class);
       Filter filter = EasyMock.createStrictMock(Filter.class);
       AddressSettings addressSettings = new AddressSettings();
-      addressSettings.setClustered(true);
       addressSettings.setMaxSizeBytes(9999);
       addressSettings.setDistributionPolicyClass("org.jboss.messaging.core.server.impl.RoundRobinDistributor");
       EasyMock.expect(addressSettingsRepository.getMatch("testQ")).andReturn(addressSettings);
@@ -69,7 +68,6 @@
       HierarchicalRepository<AddressSettings> addressSettingsRepository = EasyMock.createStrictMock(HierarchicalRepository.class);
       StorageManager sm = EasyMock.createStrictMock(StorageManager.class);
       AddressSettings addressSettings = new AddressSettings();
-      addressSettings.setClustered(false);
       addressSettings.setMaxSizeBytes(8888);
       addressSettings.setDistributionPolicyClass(null);
       EasyMock.expect(addressSettingsRepository.getMatch("testQ2")).andReturn(addressSettings);

Modified: trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueImplTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueImplTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/server/impl/QueueImplTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -199,7 +199,7 @@
 
    }
 
-   public void testSimpleDirectDelivery()
+   public void testSimpleDirectDelivery()  throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -227,7 +227,7 @@
       assertRefListsIdenticalRefs(refs, consumer.getReferences());
    }
 
-   public void testSimpleNonDirectDelivery()
+   public void testSimpleNonDirectDelivery()  throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -265,7 +265,7 @@
       assertEquals(numMessages, queue.getDeliveringCount());
    }
 
-   public void testBusyConsumer()
+   public void testBusyConsumer()  throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -309,7 +309,7 @@
       assertEquals(10, queue.getDeliveringCount());
    }
 
-   public void testBusyConsumerThenAddMoreMessages()
+   public void testBusyConsumerThenAddMoreMessages() throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -376,7 +376,7 @@
       assertEquals(30, queue.getDeliveringCount());
    }
 
-   public void testAddFirstadd()
+   public void testAddFirstadd() throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -585,7 +585,7 @@
 
    }
 
-   public void testConsumerReturningNull()
+   public void testConsumerReturningNull() throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -618,7 +618,7 @@
       }
    }
 
-   public void testRoundRobinWithQueueing()
+   public void testRoundRobinWithQueueing() throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -663,7 +663,7 @@
       }
    }
 
-   public void testRoundRobinDirect()
+   public void testRoundRobinDirect() throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 
@@ -790,7 +790,7 @@
 //      assertTrue(consumer.getReferences().isEmpty());
 //   }
 
-   public void testWithPriorities()
+   public void testWithPriorities() throws Exception
    {
       Queue queue = new QueueImpl(1, address1, queue1, null, false, true, scheduledExecutor, null, null, null);
 

Modified: trunk/tests/src/org/jboss/messaging/tests/unit/core/settings/impl/AddressSettingsTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/settings/impl/AddressSettingsTest.java	2009-02-17 17:18:39 UTC (rev 5883)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/settings/impl/AddressSettingsTest.java	2009-02-17 19:52:51 UTC (rev 5884)
@@ -38,7 +38,6 @@
       assertEquals(addressSettings.getDistributionPolicy().getClass(), AddressSettings.DEFAULT_DISTRIBUTION_POLICY_CLASS);
       assertEquals(addressSettings.getDistributionPolicyClass(), null);
       assertEquals(addressSettings.getDeadLetterAddress(), null);
-      assertEquals(addressSettings.isClustered(), Boolean.valueOf(false));
       assertEquals(addressSettings.getExpiryAddress(), null);
       assertEquals(addressSettings.getMaxDeliveryAttempts(), AddressSettings.DEFAULT_MAX_DELIVERY_ATTEMPTS);
       assertEquals(addressSettings.getMaxSizeBytes(), AddressSettings.DEFAULT_MAX_SIZE_BYTES);
@@ -52,7 +51,6 @@
    {
       AddressSettings addressSettings = new AddressSettings();
       AddressSettings addressSettingsToMerge = new AddressSettings();
-      addressSettingsToMerge.setClustered(true);
       SimpleString DLQ = new SimpleString("testDLQ");
       SimpleString exp = new SimpleString("testExpiryQueue");
       addressSettingsToMerge.setDeadLetterAddress(DLQ);
@@ -66,7 +64,6 @@
       addressSettings.merge(addressSettingsToMerge);
       assertEquals(addressSettings.getDistributionPolicy().getClass(), AddressSettings.DEFAULT_DISTRIBUTION_POLICY_CLASS);
       assertEquals(addressSettings.getDistributionPolicyClass(), null);
-      assertEquals(addressSettings.isClustered(), Boolean.valueOf(true));
       assertEquals(addressSettings.getDeadLetterAddress(), DLQ);
       assertEquals(addressSettings.getExpiryAddress(), exp);
       assertEquals(addressSettings.getMaxDeliveryAttempts(), Integer.valueOf(1000));
@@ -81,7 +78,6 @@
    {
       AddressSettings addressSettings = new AddressSettings();
       AddressSettings addressSettingsToMerge = new AddressSettings();
-      addressSettingsToMerge.setClustered(true);
       SimpleString DLQ = new SimpleString("testDLQ");
       SimpleString exp = new SimpleString("testExpiryQueue");
       addressSettingsToMerge.setDeadLetterAddress(DLQ);
@@ -92,7 +88,6 @@
       addressSettings.merge(addressSettingsToMerge);
 
       AddressSettings addressSettingsToMerge2 = new AddressSettings();
-      addressSettingsToMerge2.setClustered(true);
       SimpleString exp2 = new SimpleString("testExpiryQueue2");
       addressSettingsToMerge2.setExpiryAddress(exp2);
       addressSettingsToMerge2.setMaxSizeBytes(2001);
@@ -101,7 +96,6 @@
 
       assertEquals(addressSettings.getDistributionPolicy().getClass(), AddressSettings.DEFAULT_DISTRIBUTION_POLICY_CLASS);
       assertEquals(addressSettings.getDistributionPolicyClass(), null);
-      assertEquals(addressSettings.isClustered(), Boolean.valueOf(true));
       assertEquals(addressSettings.getDeadLetterAddress(), DLQ);
       assertEquals(addressSettings.getExpiryAddress(), exp);
       assertEquals(addressSettings.getMaxDeliveryAttempts(), Integer.valueOf(1000));
@@ -114,7 +108,6 @@
    {
       AddressSettings addressSettings = new AddressSettings();
       AddressSettings addressSettingsToMerge = new AddressSettings();
-      addressSettingsToMerge.setClustered(true);
       SimpleString DLQ = new SimpleString("testDLQ");
       SimpleString exp = new SimpleString("testExpiryQueue");
       addressSettingsToMerge.setDeadLetterAddress(DLQ);
@@ -124,7 +117,6 @@
       addressSettings.merge(addressSettingsToMerge);
 
       AddressSettings addressSettingsToMerge2 = new AddressSettings();
-      addressSettingsToMerge2.setClustered(false);
       SimpleString exp2 = new SimpleString("testExpiryQueue2");
       SimpleString DLQ2 = new SimpleString("testDlq2");
       addressSettingsToMerge2.setExpiryAddress(exp2);
@@ -137,7 +129,6 @@
 
       assertEquals(addressSettings.getDistributionPolicy().getClass(), AddressSettings.DEFAULT_DISTRIBUTION_POLICY_CLASS);
       assertEquals(addressSettings.getDistributionPolicyClass(), null);
-      assertEquals(addressSettings.isClustered(), Boolean.valueOf(true));
       assertEquals(addressSettings.getDeadLetterAddress(), DLQ);
       assertEquals(addressSettings.getExpiryAddress(), exp);
       assertEquals(addressSettings.getMaxDeliveryAttempts(), Integer.valueOf(2000));




More information about the jboss-cvs-commits mailing list