[Jboss-cvs] JBoss Messaging SVN: r1252 - in trunk: src/main/org/jboss/messaging/core src/main/org/jboss/messaging/core/plugin src/main/org/jboss/messaging/core/plugin/contract src/main/org/jboss/messaging/core/plugin/exchange src/main/org/jboss/messaging/core/plugin/exchange/request tests/src/org/jboss/test/messaging/core tests/src/org/jboss/test/messaging/core/paging tests/src/org/jboss/test/messaging/core/plugin tests/src/org/jboss/test/messaging/core/plugin/base

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Sep 1 18:08:00 EDT 2006


Author: timfox
Date: 2006-09-01 18:07:43 -0400 (Fri, 01 Sep 2006)
New Revision: 1252

Added:
   trunk/src/main/org/jboss/messaging/core/plugin/exchange/SharedState.java
   trunk/src/main/org/jboss/messaging/core/plugin/exchange/request/SendNodeIdRequest.java
Modified:
   trunk/src/main/org/jboss/messaging/core/ChannelSupport.java
   trunk/src/main/org/jboss/messaging/core/PagingChannel.java
   trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java
   trunk/src/main/org/jboss/messaging/core/plugin/contract/PersistenceManager.java
   trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredExchangeSupport.java
   trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredTopicExchange.java
   trunk/src/main/org/jboss/messaging/core/plugin/exchange/ExchangeSupport.java
   trunk/tests/src/org/jboss/test/messaging/core/SimpleReceiver.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_2PCTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_NTTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_TTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/PagingStateTestBase.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_NP_2PCTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_2PCTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_NTTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_TTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/ClusteredTopicExchangeTest.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/DirectExchangeTest.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/JGroupsUtil.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/TopicExchangeTest.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/base/ExchangeTestBase.java
Log:
Clustering interim commit 3



Modified: trunk/src/main/org/jboss/messaging/core/ChannelSupport.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/ChannelSupport.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/ChannelSupport.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -154,7 +154,7 @@
             // Since remoting doesn't currently handle non blocking IO, we still have to wait for the
             // result, but when remoting does, we can use a full SEDA approach and get even better
             // throughput.
-            this.executor.execute(new HandleRunnable(result, sender, r));
+            this.executor.execute(new HandleRunnable(result, sender, r, true));
          }
          catch (InterruptedException e)
          {
@@ -165,10 +165,39 @@
       }
       else
       {
-         return handleInternal(sender, r, tx);
+         return handleInternal(sender, r, tx, true);
       }
    }
+   
+   public Delivery handleDontPersist(DeliveryObserver sender, Routable r, Transaction tx)
+   {
+      checkClosed();
       
+      Future result = new Future();
+
+      if (tx == null)
+      {         
+         try
+         {
+            // Instead of executing directly, we add the handle request to the event queue.
+            // Since remoting doesn't currently handle non blocking IO, we still have to wait for the
+            // result, but when remoting does, we can use a full SEDA approach and get even better
+            // throughput.
+            this.executor.execute(new HandleRunnable(result, sender, r, false));
+         }
+         catch (InterruptedException e)
+         {
+            log.warn("Thread interrupted", e);
+         }
+   
+         return (Delivery)result.getResult();
+      }
+      else
+      {
+         return handleInternal(sender, r, tx, false);
+      }
+   }
+      
    // DeliveryObserver implementation --------------------------
 
    public void acknowledge(Delivery d, Transaction tx) throws Throwable
@@ -642,7 +671,7 @@
       }
    }
 
-   protected Delivery handleInternal(DeliveryObserver sender, Routable r, Transaction tx)
+   protected Delivery handleInternal(DeliveryObserver sender, Routable r, Transaction tx, boolean persist)
    {
       if (r == null)
       {
@@ -683,7 +712,7 @@
                return null;
             }
         
-            if (ref.isReliable() && recoverable)
+            if (persist && ref.isReliable() && recoverable)
             {
                // Reliable message in a recoverable state - also add to db
                if (trace) { log.trace(this + "adding " + ref + " to database non-transactionally"); }
@@ -724,7 +753,7 @@
                if (trace) { log.trace(this + " added transactionally " + ref + " in memory"); }
             }
 
-            if (ref.isReliable() && recoverable)
+            if (persist && ref.isReliable() && recoverable)
             {
                // Reliable message in a recoverable state - also add to db
                if (trace) { log.trace(this + "adding " + ref + (tx == null ? " to database non-transactionally" : " in transaction: " + tx)); }
@@ -1084,17 +1113,20 @@
       DeliveryObserver sender;
 
       Routable routable;
+      
+      boolean persist;
 
-      HandleRunnable(Future result, DeliveryObserver sender, Routable routable)
+      HandleRunnable(Future result, DeliveryObserver sender, Routable routable, boolean persist)
       {
          this.result = result;
          this.sender = sender;
          this.routable = routable;
+         this.persist = persist;
       }
 
       public void run()
       {
-         Delivery d = handleInternal(sender, routable, null);
+         Delivery d = handleInternal(sender, routable, null, persist);
          result.setResult(d);
       }
    }   

Modified: trunk/src/main/org/jboss/messaging/core/PagingChannel.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/PagingChannel.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/PagingChannel.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -88,6 +88,11 @@
    protected long nextPagingOrder;
    
    /**
+    * Are there any paged references in storage?
+    */
+   //protected boolean refsInStorage;
+   
+   /**
     * @param channelID
     * @param ms
     * @param pm
@@ -135,15 +140,25 @@
    public void load() throws Exception
    {
       if (trace) { log.trace(this + " loading channel state"); }
-      
       synchronized (refLock)
       {
          InitialLoadInfo ili = pm.getInitialReferenceInfos(channelID, fullSize);
+
+         if (ili.getMaxPageOrdering() != null)            
+         {
+            //refsInStorage = true;
+            
+            firstPagingOrder = ili.getMinPageOrdering().longValue();
+            
+            nextPagingOrder = ili.getMaxPageOrdering().longValue() + 1;
+         }
+         else
+         {
+            //refsInStorage = false;
+            
+            firstPagingOrder = nextPagingOrder = 0;
+         }
          
-         firstPagingOrder = ili.getMinPageOrdering();
-         
-         nextPagingOrder = ili.getMaxPageOrdering();
-         
          Map refMap = processReferences(ili.getRefInfos());
          
          Iterator iter = ili.getRefInfos().iterator();
@@ -180,6 +195,8 @@
    {
       if (trace) { log.trace(this + " cancelling " + del + " in memory"); }
 
+      log.info(this + " cancelling " + del + " in memory");
+      
       boolean removed;
 
       synchronized (deliveryLock)
@@ -209,7 +226,9 @@
 
                MessageReference ref = (MessageReference)messageRefs.removeLast();
 
-               addToDownCache(ref);
+               log.info("Adding ref to downcache");
+               
+               addToDownCache(ref, true);
             }
          }
 
@@ -258,7 +277,7 @@
       {
          if (paging)
          {
-            addToDownCache(ref);
+            addToDownCache(ref, false);
          }
          else
          {
@@ -277,7 +296,7 @@
       }
    }
    
-   protected void addToDownCache(MessageReference ref) throws Exception
+   protected void addToDownCache(MessageReference ref, boolean cancelling) throws Exception
    {
       // If the down cache exists then refs are not spilled over immediately,
       // but store in the cache and spilled over in one go when the next load is requested,
@@ -288,14 +307,40 @@
       // references actually get added to storage, reliable references instead
       // just get their page ordering column updated since they will already be in storage
 
+      //If cancelling then the ref is supposed to go back on the front of the queue segment in storage
+      //so we set the page ordering to be firstPageOrdering - 1
+      //If not cancelling, then the ref should go on the end of the quueue in storage so
+      //we set the page ordering to be nextPageOrdering
+      
+      if (cancelling)
+      {
+         ref.setPagingOrder(firstPagingOrder - 1);
+         
+         log.info("Cancelling so set paging order to: " + (firstPagingOrder - 1));
+         
+         firstPagingOrder--;
+      }
+      else
+      {
+         ref.setPagingOrder(nextPagingOrder);
+         
+         log.info("Adding so set paging order to: " + nextPagingOrder);
+         
+         nextPagingOrder++;
+      }
+      
       downCache.add(ref);
 
       if (trace) { log.trace(ref + " sent to downcache"); }
+      
+      log.info("Added to down cache, down cache size:" + downCache.size());
 
       if (downCache.size() == downCacheSize)
       {
          if (trace) { log.trace(this + "'s downcache is full (" + downCache.size() + " messages)"); }
          
+         log.info("flushing down cache");
+         
          flushDownCache();
       }
    }
@@ -314,16 +359,10 @@
 
       Iterator iter = downCache.iterator();
       
-      //It's important that we don't actually increment nextPagingOrder in the loop
-      //in case of failure
-      int count = 0;
-
       while (iter.hasNext())
       {
          MessageReference ref = (MessageReference) iter.next();
          
-         ref.setPagingOrder(nextPagingOrder + count++);
-
          if (ref.isReliable() && recoverable)
          {
             toUpdate.add(ref);
@@ -336,10 +375,12 @@
 
       if (!toAdd.isEmpty())
       {
+         log.info("Adding refs: " + toAdd.size());
          pm.addReferences(channelID, toAdd);
       }
       if (!toUpdate.isEmpty())
       {
+         log.info("Updating refs: " + toAdd.size());
          pm.updatePageOrder(channelID, toUpdate);
       }
 
@@ -355,14 +396,7 @@
          ref.releaseMemoryReference();
       }
 
-      downCache.clear();
-      
-      //If we get this far then the database operations succeeded so we can update nextPagingOrder
-      //We don't do this before the database updates since otherwise we will end up with gaps
-      //in page ordering in the database if the db temporarily fails then comes back to life without
-      //restarting the server.
-      
-      nextPagingOrder += count;      
+      downCache.clear();         
 
       if (trace) { log.trace(this + " cleared downcache"); }
    }

Modified: trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -617,7 +617,7 @@
             }
             
             //Now store the reference
-            addReference(channelID, ref, psInsertReference);
+            addReference(channelID, ref, psInsertReference, true);
                         
             if (usingBatchUpdates)
             {
@@ -1167,25 +1167,23 @@
                   
          rs.next();
          
-         long minOrdering = rs.getLong(1);
+         Long minOrdering = new Long(rs.getLong(1));
          
          if (rs.wasNull())
          {
-            minOrdering = -1;
+            minOrdering = null;
          }
          
-         long maxOrdering = rs.getLong(2);
+         Long maxOrdering = new Long(rs.getLong(2));
          
          if (rs.wasNull())
          {
-            maxOrdering = -1;
+            maxOrdering = null;
          }
          
          //Must cope with the possibility that fullSize has changed for the channel since last
          //restart
          
-         conn = ds.getConnection();
-         
          ps = conn.prepareStatement(getSQLStatement("LOAD_UNPAGED_REFS"));
          
          ps.setLong(1, channelID);
@@ -1222,30 +1220,29 @@
             
             if (count < fullSize)
             {
-               if (minOrdering != -1)
+               if (minOrdering != null)
                {
                   //This means that fullSize is now greater and we have some paged refs
                   //We need to convert some of the paged refs into non paged refs before loading               
                   
                   //We can do this by setting page_ord = null for the first x paged refs                  
                   
-                  long numberPaged = 1 + maxOrdering - minOrdering;
+                  long numberPaged = 1 + maxOrdering.longValue() - minOrdering.longValue();
                   
                   long numberToConvert = Math.min(numberPaged, fullSize - count);
                                     
                   ps = conn.prepareStatement(getSQLStatement("UPDATE_RELIABLE_REFS_NOT_PAGED"));
                   
-                  ps.setLong(1, minOrdering);
-                  ps.setLong(2, minOrdering + numberToConvert - 1);
+                  ps.setLong(1, minOrdering.longValue());
+                  ps.setLong(2, minOrdering.longValue() + numberToConvert - 1);
                   ps.setLong(3, channelID);
                   
                   ps.executeUpdate();
                   
-                  minOrdering += numberToConvert;      
-                  
-                  if (minOrdering == maxOrdering + 1)
+                  minOrdering = new Long(minOrdering.longValue() + numberToConvert);
+                  if (minOrdering.longValue() == maxOrdering.longValue() + 1)
                   {
-                     minOrdering = maxOrdering = -1;
+                     minOrdering = maxOrdering = null;
                   }
                   
                   ps.close();
@@ -1299,23 +1296,23 @@
                ps = conn.prepareStatement(getSQLStatement("UPDATE_PAGE_ORDER"));
                                              
                long c;
-               if (minOrdering == -1)
+               if (minOrdering == null)
                {
                   c = 0;
-                  minOrdering = 0;
+                  minOrdering = new Long(0);
                }
                else
                {
-                  c = minOrdering;
+                  c = minOrdering.longValue();
                }
                
-               if (maxOrdering == -1)
+               if (maxOrdering == null)
                {
-                  maxOrdering = numberToConvert - 1;
+                  maxOrdering = new Long(numberToConvert - 1);
                }
                else
                {
-                  maxOrdering += numberToConvert;
+                  maxOrdering = new Long(maxOrdering.longValue() + numberToConvert);
                }
                
                Iterator iter = extraRefs.iterator();
@@ -1513,7 +1510,7 @@
             psReference = conn.prepareStatement(getSQLStatement("INSERT_MESSAGE_REF"));
             
             // Add the reference
-            addReference(channelID, ref, psReference);
+            addReference(channelID, ref, psReference, false);
             
             int rows = psReference.executeUpdate();            
             
@@ -2081,7 +2078,7 @@
             }
             
             //Now store the reference
-            addReference(pair.channelId, ref, psReference);
+            addReference(pair.channelId, ref, psReference, false);
               
             if (batch)
             {
@@ -3219,7 +3216,7 @@
       }
    }  
    
-   protected void addReference(long channelID, MessageReference ref, PreparedStatement ps) throws Exception
+   protected void addReference(long channelID, MessageReference ref, PreparedStatement ps, boolean paged) throws Exception
    {
       if (trace)
       {
@@ -3230,13 +3227,13 @@
       ps.setLong(2, ref.getMessageID());
       ps.setNull(3, Types.BIGINT);
       ps.setString(4, "C");
-      if (ref.getPagingOrder() == -1)
+      if (paged)
       {
-         ps.setNull(5, Types.BIGINT);
+         ps.setLong(5, ref.getPagingOrder());
       }
       else
       {
-         ps.setLong(5, ref.getPagingOrder());
+         ps.setNull(5, Types.BIGINT);
       }
       ps.setInt(6, ref.getDeliveryCount());
       ps.setString(7, ref.isReliable() ? "Y" : "N");

Modified: trunk/src/main/org/jboss/messaging/core/plugin/contract/PersistenceManager.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/contract/PersistenceManager.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/plugin/contract/PersistenceManager.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -104,25 +104,25 @@
    
    class InitialLoadInfo
    {
-      private long minPageOrdering;
+      private Long minPageOrdering;
       
-      private long maxPageOrdering;
+      private Long maxPageOrdering;
       
       private List refInfos;
 
-      public InitialLoadInfo(long minPageOrdering, long maxPageOrdering, List refInfos)
+      public InitialLoadInfo(Long minPageOrdering, Long maxPageOrdering, List refInfos)
       {
          this.minPageOrdering = minPageOrdering;
          this.maxPageOrdering = maxPageOrdering;
          this.refInfos = refInfos;
       }
 
-      public long getMaxPageOrdering()
+      public Long getMaxPageOrdering()
       {
          return maxPageOrdering;
       }
 
-      public long getMinPageOrdering()
+      public Long getMinPageOrdering()
       {
          return minPageOrdering;
       }

Modified: trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredExchangeSupport.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredExchangeSupport.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredExchangeSupport.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -22,6 +22,7 @@
 package org.jboss.messaging.core.plugin.exchange;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -38,9 +39,11 @@
 import org.jboss.messaging.core.plugin.contract.PersistenceManager;
 import org.jboss.messaging.core.plugin.exchange.request.BindRequest;
 import org.jboss.messaging.core.plugin.exchange.request.MessageRequest;
+import org.jboss.messaging.core.plugin.exchange.request.SendNodeIdRequest;
 import org.jboss.messaging.core.plugin.exchange.request.UnbindRequest;
 import org.jgroups.Address;
 import org.jgroups.Channel;
+import org.jgroups.MembershipListener;
 import org.jgroups.Message;
 import org.jgroups.MessageListener;
 import org.jgroups.Receiver;
@@ -78,6 +81,8 @@
    
    private Receiver dataReceiver;
    
+   private MembershipListener controlMembershipListener;
+   
    private RequestHandler requestHandler;
    
    private Object setStateLock = new Object();
@@ -86,8 +91,14 @@
    
    private String groupName;
    
-   //protected boolean clustered;
+   private View currentView;
    
+   private Address currentAddress;
+   
+   //Map < Address, node id>
+   private Map nodeIdAddressMap;
+   
+   
    public ClusteredExchangeSupport() throws Exception
    {                  
    }
@@ -112,6 +123,8 @@
       
       this.groupName = groupName;
       
+      this.nodeIdAddressMap = new HashMap();
+      
       //We don't want to receive local messages on any of the channels
       controlChannel.setOpt(Channel.LOCAL, Boolean.FALSE);
       dataChannel.setOpt(Channel.LOCAL, Boolean.FALSE);
@@ -120,11 +133,13 @@
         
       this.requestHandler = new ExchangeRequestHandler();
       
+      this.controlMembershipListener = new ControlMembershipListener();
+      
       this.controlMessageDispatcher = new MessageDispatcher(controlChannel, controlMessageListener,
-                                                            null, requestHandler, true);      
-      this.dataReceiver = new DataMessageListener();
+                                                            controlMembershipListener, requestHandler, true);      
+      this.dataReceiver = new DataReceiver();
       
-      dataChannel.setReceiver(dataReceiver);
+      dataChannel.setReceiver(dataReceiver);                  
    }
    
    // ServiceMBeanSupport overrides ---------------------------------
@@ -137,7 +152,15 @@
       dataChannel.connect(groupName);
       log.info("Connected to data channel");
       
-      super.startService();            
+      currentAddress = controlChannel.getLocalAddress();
+      
+      log.info("My address is: " + currentAddress);
+      
+      super.startService();  
+      
+      handleAddressNodeMapping(currentAddress, nodeId);
+      
+      sendNodeIdRequest(currentAddress, nodeId);      
    }
    
    protected void stopService() throws Exception
@@ -154,7 +177,7 @@
    public Binding bindQueue(String queueName, String condition, Filter filter, boolean noLocal, boolean durable,
                             MessageStore ms, PersistenceManager pm,
                             int fullSize, int pageSize, int downCacheSize) throws Exception
-   {
+   {           
       Binding binding = super.bindQueue(queueName, condition, filter, noLocal, durable,
                                         ms, pm, fullSize, pageSize, downCacheSize);
       
@@ -224,8 +247,7 @@
    }
    
    protected abstract void routeFromCluster(MessageReference ref, String routingKey) throws Exception;
-   
-   
+      
    // Private ------------------------------------------------------------------------------------------
       
    /*
@@ -240,7 +262,13 @@
       log.info("node " + this.nodeId + " received request to add binding from node " + nodeId);
       
       try
-      {         
+      {                     
+         //Sanity
+         if (!nodeIdAddressMap.containsKey(nodeId))
+         {
+            throw new IllegalStateException("Cannot find address for node: " + nodeId);
+         }
+         
          // We currently only allow one binding per name per node
          Map nameMap = (Map)nameMaps.get(nodeId);
          
@@ -253,7 +281,7 @@
          
          if (binding != null)
          {
-            throw new IllegalArgumentException("Binding already exists for node Id " + nodeId + " queue name " + queueName);
+            throw new IllegalArgumentException(this.nodeId + "Binding already exists for node Id " + nodeId + " queue name " + queueName);
          }
          
          binding = new SimpleBinding(nodeId, queueName, condition, filterString,
@@ -278,25 +306,107 @@
     */
    private void removeBindingFromCluster(String nodeId, String queueName) throws Exception
    {
+      log.info(this.nodeId + " removing binding from cluster for nodeId: " + nodeId + " and queuename: " + queueName);
+      
       lock.writeLock().acquire();
       
       try
       {         
-         // We currently only allow one binding per name per node
-         Map nameMap = (Map)nameMaps.get(nodeId);
+         // Sanity
+         if (!nodeIdAddressMap.containsKey(nodeId))
+         {
+            throw new IllegalStateException("Cannot find address for node: " + nodeId);
+         }
          
-         Binding binding = null;
+         removeBinding(nodeId, queueName);         
+      }
+      finally
+      {
+         lock.writeLock().release();
+      }
+   }
+   
+   private void handleAddressNodeMapping(Address address, String nodeId) throws Exception
+   {
+      lock.writeLock().acquire();
+      
+      try
+      { 
+         log.info("Handling node address mapping for: " + address + " and " + nodeId);
+         nodeIdAddressMap.put(nodeId, address.toString());
+      }
+      finally
+      {
+         lock.writeLock().release();
+      }
+   }
+      
+   private void removeBindingsForAddress(String address) throws Exception
+   {
+      lock.writeLock().acquire();
+      
+      log.info("Removing bindings for address: " + address);
+      
+      try
+      { 
+         Iterator iter = nodeIdAddressMap.entrySet().iterator();
          
-         if (nameMap != null)
+         String nodeId = null;
+         while (iter.hasNext())
          {
-            binding = (Binding)nameMap.remove(queueName);
+            Map.Entry entry = (Map.Entry)iter.next();
+            
+            String str = (String)entry.getValue();
+            
+            if (str.equals(address))
+            {
+               nodeId = (String)entry.getKey();
+            }
          }
          
-         if (binding == null)
+         if (nodeId == null)
          {
-            throw new IllegalArgumentException("Cannot find binding with node Id " + nodeId + " queue name: " + queueName);
+            throw new IllegalStateException("Cannot find node id for address: " + address);
          }
          
+         log.info("This address corresponds to node id: " + nodeId);
+         
+         Map nameMap = (Map)nameMaps.get(nodeId);
+
+         if (nameMap != null)
+         {
+            log.info("Found the name map");
+            List toRemove = new ArrayList();
+            
+            iter = nameMap.values().iterator();
+            
+            while (iter.hasNext())
+            {
+               Binding binding = (Binding)iter.next();
+               
+               log.info("Got a binding");
+               
+               if (!binding.isDurable())
+               {
+                  log.info("It's not - durable");
+                  toRemove.add(binding);
+               }
+               else
+               {
+                  log.info("It IS durable - not removing it");
+               }
+            }
+            
+            iter = toRemove.iterator();
+            
+            while (iter.hasNext())
+            {
+               Binding binding = (Binding)iter.next();
+               
+               removeBinding(nodeId, binding.getQueueName());
+               log.info("removed binding");
+            }
+         }
       }
       finally
       {
@@ -345,13 +455,21 @@
       //so we ignore the return value
       
       //TODO - How do we know if the call timed out???
-      //We need to handle this
+      //We need to handle this      
+   }
+   
+   private void sendNodeIdRequest(Address address, String nodeId) throws Exception
+   {
+      SendNodeIdRequest request = new SendNodeIdRequest(address, nodeId);
       
+      Message message = new Message(null, null, request);
+      
+      controlMessageDispatcher.castMessage(null, message, GroupRequest.GET_ALL, CAST_TIMEOUT);      
    }
    
    //TODO - Sort out serialization properly
    
-   private byte[] getBindingListAsBytes() throws Exception
+   private byte[] getStateAsBytes() throws Exception
    {
       List bindings = new ArrayList();
       
@@ -369,19 +487,23 @@
          }
       }
       
-      byte[] bytes = Util.objectToByteBuffer(bindings);
+      SharedState state = new SharedState(bindings, nodeIdAddressMap);
       
+      byte[] bytes = Util.objectToByteBuffer(state);
+      
       return bytes;
    }
    
-   private void processBindingListBytes(byte[] bytes) throws Exception
+   private void processStateBytes(byte[] bytes) throws Exception
    {
+      SharedState state = (SharedState)Util.objectFromByteBuffer(bytes);
+      
       nameMaps.clear();
       
       conditionMap.clear();
+                 
+      List bindings = state.getBindings();
       
-      List bindings = (List)Util.objectFromByteBuffer(bytes);
-      
       Iterator iter = bindings.iterator();
       
       while (iter.hasNext())
@@ -390,8 +512,14 @@
          
          addBinding(binding);
       }
+      
+      this.nodeIdAddressMap.clear();
+      
+      this.nodeIdAddressMap.putAll(state.getNodeIdAddressMap());
    }
    
+
+   
    // Inner classes -------------------------------------------------------------------
     
    /*
@@ -400,9 +528,7 @@
    private class ControlMessageListener implements MessageListener
    {
       public byte[] getState()
-      {
-         //TODO should we propagate the exceptions up??
-         
+      {     
          log.info(this + " getState called");
          try
          {
@@ -414,12 +540,13 @@
          }
          try
          {
-            return getBindingListAsBytes();
+            return getStateAsBytes();
          }
          catch (Exception e)
          {
-            log.error("Failed to get state", e);
-            return null;
+            IllegalStateException e2 = new IllegalStateException(e.getMessage());
+            e2.setStackTrace(e.getStackTrace());
+            throw e2;
          }     
          finally
          {
@@ -434,8 +561,6 @@
       
       public void setState(byte[] bytes)
       {
-         // TODO should we propagate the exceptions up??
-         
          log.info(this + " setState called");
          log.info("state is: " + bytes);
          
@@ -452,11 +577,13 @@
             }
             try
             {
-               processBindingListBytes(bytes);               
+               processStateBytes(bytes);               
             }
             catch (Exception e)
             {
-               log.error("Failed to deserialize", e);
+               IllegalStateException e2 = new IllegalStateException(e.getMessage());
+               e2.setStackTrace(e.getStackTrace());
+               throw e2;
             }
             finally
             {
@@ -481,7 +608,7 @@
    /*
     * This class is used to listen for messages on the data channel
     */
-   private class DataMessageListener implements Receiver
+   private class DataReceiver implements Receiver
    {
       public void block()
       {   
@@ -540,8 +667,9 @@
          }
          catch (Exception e)
          {
-            log.error("Failed to route from cluster", e);
-            //TODO should we propagate exceptions up?
+            IllegalStateException e2 = new IllegalStateException(e.getMessage());
+            e2.setStackTrace(e.getStackTrace());
+            throw e2;
          }
          
       }
@@ -551,6 +679,67 @@
          //NOOP         
       }      
    }
+     
+   /*
+    * We use this class so we notice when members leave the group
+    */
+   private class ControlMembershipListener implements MembershipListener
+   {
+      public void block()
+      {
+         //NOOP
+      }
+
+      public void suspect(Address address)
+      {
+         //NOOP
+      }
+
+      public void viewAccepted(View view)
+      {
+         log.info(" *****************************New view" + view);
+        
+         if (currentView != null)
+         {
+            Iterator iter = currentView.getMembers().iterator();
+            
+            while (iter.hasNext())
+            {
+               Address address = (Address)iter.next();
+               
+               if (!view.containsMember(address))
+               {
+                  //Member must have left
+                  log.info(nodeId + " The following member has left: " + address);
+                  
+                  //We don't remove bindings for ourself
+                  
+                  if (!address.equals(currentAddress))
+                  {                  
+                     try
+                     {
+                        removeBindingsForAddress(address.toString());
+                     }               
+                     catch (Exception e)
+                     {
+                        IllegalStateException e2 = new IllegalStateException(e.getMessage());
+                        e2.setStackTrace(e.getStackTrace());
+                        throw e2;
+                     }
+                  }
+               }
+            }
+         }
+         
+         currentView = view;
+      }
+
+      public byte[] getState()
+      {        
+         //NOOP
+         return null;
+      }     
+   }
    
    /*
     * This class is used to handle synchronous requests
@@ -566,7 +755,7 @@
          Object request = message.getObject();
          
          log.info("Received request: " + request);
-         
+            
          if (request instanceof BindRequest)
          {
             BindRequest br = (BindRequest)request;
@@ -578,7 +767,9 @@
             }
             catch (Exception e)
             {
-               log.error("Failed to add binding from cluster", e);
+               IllegalStateException e2 = new IllegalStateException(e.getMessage());
+               e2.setStackTrace(e.getStackTrace());
+               throw e2;
             }
          }
          else if (request instanceof UnbindRequest)
@@ -591,9 +782,26 @@
             }
             catch (Exception e)
             {
-               log.error("Failed to remove binding from cluster", e);
+               IllegalStateException e2 = new IllegalStateException(e.getMessage());
+               e2.setStackTrace(e.getStackTrace());
+               throw e2;
             }
          }
+         else if (request instanceof SendNodeIdRequest)
+         {
+            SendNodeIdRequest snr = (SendNodeIdRequest)request;
+            
+            try
+            {
+               handleAddressNodeMapping(snr.getAddress(), snr.getNodeId());
+            }
+            catch (Exception e)
+            {
+               IllegalStateException e2 = new IllegalStateException(e.getMessage());
+               e2.setStackTrace(e.getStackTrace());
+               throw e2;
+            }
+         }
          else
          {
             throw new IllegalArgumentException("Invalid request: " + request);

Modified: trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredTopicExchange.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredTopicExchange.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/plugin/exchange/ClusteredTopicExchange.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -217,6 +217,16 @@
                else
                {
                   CastingCallback callback = (CastingCallback)tx.getKeyedCallback(this);
+                  
+                  if (callback == null)
+                  {
+                     callback = new CastingCallback();
+                     
+                     tx.addKeyedCallback(callback, this);
+                  }
+                  
+                  log.info("Got callback:" + callback);
+                  
                   callback.addMessage(routingKey, ref.getMessage());                  
                }
             }
@@ -262,19 +272,18 @@
                {            
                   if (binding.getNodeId().equals(this.nodeId))
                   {
-                     //When receiving a reliable message from the network and routing to
-                     //a durable subscription, then the message has always been persisted
-                     //before the send, so we route the message as an unreliable message
-                     //to prevent it being persisted again
-                     if (ref.isReliable() && binding.isDurable())
-                     {
-                        ref.setReliable(false);
-                     }
+//                     //When receiving a reliable message from the network and routing to
+//                     //a durable subscription, then the message has always been persisted
+//                     //before the send
+//                     if (ref.isReliable() && binding.isDurable())
+//                     {
+//                        //Do what?
+//                     }
                      
                      //It's a local binding so we pass the message on to the subscription
                      MessageQueue subscription = binding.getQueue();
                   
-                     subscription.handle(null, ref, null);
+                     subscription.handleDontPersist(null, ref, null);
                   }                               
                }
             }                          
@@ -291,10 +300,11 @@
     */
    private class CastingCallback implements TxCallback
    {           
-      private List messages;
+      private List messages = new ArrayList();
       
       private void addMessage(String routingKey, Message message)
       {
+         log.info("Adding message");
          messages.add(new MessageHolder(routingKey, message));
       }
       

Modified: trunk/src/main/org/jboss/messaging/core/plugin/exchange/ExchangeSupport.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/exchange/ExchangeSupport.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/plugin/exchange/ExchangeSupport.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -28,6 +28,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -156,7 +157,7 @@
          
          if (binding != null)
          {
-            throw new Exception("Binding already exists for name " + queueName);
+            throw new IllegalArgumentException("Binding already exists for name " + queueName);
          }
          
          long id = idManager.getId();         
@@ -196,6 +197,8 @@
          lock.writeLock().release();
       }
    }
+   
+   
       
    public Binding unbindQueue(String queueName) throws Throwable
    {
@@ -208,53 +211,7 @@
       
       try
       {         
-         Map nameMap = (Map)nameMaps.get(this.nodeId);
-         
-         Binding binding = null;
-         
-         if (nameMap != null)
-         {
-            binding = (Binding)nameMap.remove(queueName);
-         }
-         
-         if (binding == null)
-         {
-            throw new IllegalStateException("Name map does not contain binding for " + queueName);
-         }
-         
-         if (binding.getQueue() == null)
-         {
-            throw new IllegalStateException("Need to reload the queue before unbinding");
-         }
-         
-         List bindings = (List)conditionMap.get(binding.getCondition());
-         
-         if (bindings == null)
-         {
-            throw new IllegalStateException("Cannot find condition bindings for " + binding.getCondition());
-         }
-         
-         boolean removed = bindings.remove(binding);
-         
-         if (!removed)
-         {
-            throw new IllegalStateException("Cannot find binding in condition binding list");
-         }
-         
-         if (binding == null)
-         {
-            throw new IllegalStateException("Channel id map does not contain binding for " + binding.getChannelId());
-         }
-         
-         if (!removed)
-         {
-            throw new IllegalStateException("Cannot find binding in condition binding list");
-         }
-         
-         if (bindings.isEmpty())
-         {
-            conditionMap.remove(binding.getCondition());
-         }
+         Binding binding = removeBinding(this.nodeId, queueName);
       
          if (binding.isDurable())
          {
@@ -586,13 +543,13 @@
    
    protected void addBinding(Binding binding)
    {
-      Map nameMap = (Map)nameMaps.get(this.nodeId);
+      Map nameMap = (Map)nameMaps.get(binding.getNodeId());
       
       if (nameMap == null)
       {
-         nameMap = new HashMap();
+         nameMap = new LinkedHashMap();
          
-         nameMaps.put(this.nodeId, nameMap);
+         nameMaps.put(binding.getNodeId(), nameMap);
       }
       
       nameMap.put(binding.getQueueName(), binding);
@@ -611,6 +568,70 @@
       bindings.add(binding);
    }   
    
+   protected Binding removeBinding(String nodeId, String queueName)
+   {
+      if (queueName == null)
+      {
+         throw new IllegalArgumentException("Queue name is null");
+      }
+             
+      Map nameMap = (Map)nameMaps.get(nodeId);
+      
+      Binding binding = null;
+      
+      if (nameMap != null)
+      {
+         binding = (Binding)nameMap.remove(queueName);
+      }
+      
+      if (binding == null)
+      {
+         throw new IllegalStateException("Name map does not contain binding for " + queueName);
+      }
+      
+      if (nameMap.isEmpty())
+      {
+         nameMaps.remove(nodeId);
+      }
+      
+      if (binding.getQueue() == null && nodeId.equals(this.nodeId))
+      {
+         //Otherwise the data won't get deleted from the database
+         throw new IllegalStateException("Need to reload the queue before unbinding");
+      }
+      
+      List bindings = (List)conditionMap.get(binding.getCondition());
+      
+      if (bindings == null)
+      {
+         throw new IllegalStateException("Cannot find condition bindings for " + binding.getCondition());
+      }
+      
+      boolean removed = bindings.remove(binding);
+      
+      if (!removed)
+      {
+         throw new IllegalStateException("Cannot find binding in condition binding list");
+      }
+      
+      if (binding == null)
+      {
+         throw new IllegalStateException("Channel id map does not contain binding for " + binding.getChannelId());
+      }
+      
+      if (!removed)
+      {
+         throw new IllegalStateException("Cannot find binding in condition binding list");
+      }
+      
+      if (bindings.isEmpty())
+      {
+         conditionMap.remove(binding.getCondition());
+      }        
+      
+      return binding;
+   }
+   
    // PersistentServiceSupport overrides ----------------------------
    
    protected Map getDefaultDMLStatements()
@@ -676,9 +697,9 @@
    {
       lock = new WriterPreferenceReadWriteLock();
       
-      nameMaps = new HashMap();
+      nameMaps = new LinkedHashMap();
        
-      conditionMap = new HashMap();   
+      conditionMap = new LinkedHashMap();   
    }
                   
    // Inner classes -------------------------------------------------            

Added: trunk/src/main/org/jboss/messaging/core/plugin/exchange/SharedState.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/exchange/SharedState.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/plugin/exchange/SharedState.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * 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.plugin.exchange;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A SharedState
+ *
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @version <tt>$Revision: 1.1 $</tt>
+ *
+ * $Id$
+ *
+ */
+public class SharedState implements Serializable
+{
+   private static final long serialVersionUID = 7782131373080845107L;
+
+   private List bindings;
+   
+   private Map nodeIdAddressMap;
+   
+   public SharedState(List bindings, Map nodeIdAddressMap)
+   {
+      this.bindings = bindings;
+      
+      this.nodeIdAddressMap = nodeIdAddressMap;
+   }
+   
+   public List getBindings()
+   {
+      return bindings;
+   }
+   
+   public Map getNodeIdAddressMap()
+   {
+      return nodeIdAddressMap;
+   }
+}

Added: trunk/src/main/org/jboss/messaging/core/plugin/exchange/request/SendNodeIdRequest.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/exchange/request/SendNodeIdRequest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/src/main/org/jboss/messaging/core/plugin/exchange/request/SendNodeIdRequest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * 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.plugin.exchange.request;
+
+import java.io.Serializable;
+
+import org.jgroups.Address;
+
+/**
+ * A SendNodeIdRequest
+ *
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @version <tt>$Revision: 1.1 $</tt>
+ *
+ * $Id$
+ *
+ */
+public class SendNodeIdRequest implements Serializable
+{
+   private static final long serialVersionUID = -122859945318661852L;
+
+   private Address address;
+   
+   private String nodeId;
+   
+   public SendNodeIdRequest(Address address, String nodeId)
+   {
+      this.address = address;
+      this.nodeId = nodeId;      
+   }
+   
+   public Address getAddress()
+   {
+      return address;
+   }
+   
+   public String getNodeId()
+   {
+      return nodeId;
+   }
+}

Modified: trunk/tests/src/org/jboss/test/messaging/core/SimpleReceiver.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/SimpleReceiver.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/SimpleReceiver.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -149,6 +149,8 @@
                                        "THE BEHAVIOUR OF A BROKEN RECEIVER");
          }
 
+        log.info("State is:" + state);
+         
          boolean done = ACKING.equals(state) ? true : false;
          log.info(this + " is " + (done ? "ACKing" : "NACKing") +  " message " + r);
          
@@ -290,6 +292,7 @@
          Message m = (Message)o[0];
          if (m == r)
          {
+            log.info("*** found it");
             d = (Delivery)o[1];
             touple = o;
             break;

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_2PCTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_2PCTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_2PCTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -91,7 +91,7 @@
       tx.commit();
       
       //Queue1
-      List refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      List refIds = getPagedReferenceIds(queue1.getChannelID());
       assertEquals(0, refIds.size());
       
       refIds = getReferenceIds(queue1.getChannelID());
@@ -107,7 +107,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(0, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -150,7 +150,7 @@
       tx.commit();
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
               
       assertEquals(0, refIds.size());
       
@@ -167,7 +167,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(25, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -212,7 +212,7 @@
       tx.commit();
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
                 
       assertEquals(0, refIds.size());
       
@@ -229,7 +229,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(50, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -273,7 +273,7 @@
       tx.commit();
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
                 
       assertEquals(50, refIds.size());
       
@@ -290,7 +290,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(100, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_NTTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_NTTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_NTTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -93,7 +93,7 @@
       }
       
       //Queue1
-      List refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      List refIds = getPagedReferenceIds(queue1.getChannelID());
       assertEquals(0, refIds.size());
       
       refIds = getReferenceIds(queue1.getChannelID());
@@ -109,7 +109,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(0, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -150,7 +150,7 @@
       }
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
               
       assertEquals(0, refIds.size());
       
@@ -167,7 +167,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(25, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -210,7 +210,7 @@
       }
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
                 
       assertEquals(0, refIds.size());
       
@@ -227,7 +227,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(50, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -269,7 +269,7 @@
       }
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
                 
       assertEquals(50, refIds.size());
       
@@ -286,7 +286,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(100, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_TTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_TTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/ChannelShare_P_TTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -94,7 +94,7 @@
       tx.commit();
       
       //Queue1
-      List refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      List refIds = getPagedReferenceIds(queue1.getChannelID());
       assertEquals(0, refIds.size());
       
       refIds = getReferenceIds(queue1.getChannelID());
@@ -110,7 +110,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(0, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -152,7 +152,7 @@
       tx.commit();
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
               
       assertEquals(0, refIds.size());
       
@@ -169,7 +169,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(25, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -213,7 +213,7 @@
       tx.commit();
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
                 
       assertEquals(0, refIds.size());
       
@@ -230,7 +230,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(50, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());
@@ -273,7 +273,7 @@
       tx.commit();
       
       //Queue1
-      refIds = getUnloadedReferenceIds(queue1.getChannelID());
+      refIds = getPagedReferenceIds(queue1.getChannelID());
                 
       assertEquals(50, refIds.size());
       
@@ -290,7 +290,7 @@
       
       //Queue2
       
-      refIds = getUnloadedReferenceIds(queue2.getChannelID());
+      refIds = getPagedReferenceIds(queue2.getChannelID());
       assertEquals(100, refIds.size());
       
       refIds = getReferenceIds(queue2.getChannelID());

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/PagingStateTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/PagingStateTestBase.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/PagingStateTestBase.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -128,6 +128,8 @@
 
    protected void assertSameIds(List ids, MessageReference[] refs, int start, int end)
    {
+      log.info("&&&&&& size is " + ids.size());
+      
       assertNotNull(ids);
       assertEquals(ids.size(), end - start + 1);
       Iterator iter = ids.iterator();
@@ -135,9 +137,12 @@
       while (iter.hasNext())
       {
          Long id = (Long)iter.next();
-         assertEquals(id.longValue(), refs[i].getMessageID());
+         log.info("id is:" + id);
+         assertEquals(refs[i].getMessageID(), id.longValue());
          i++;
       }
+      
+      log.info("&&& done");
    }
    
    class ConsumingReceiver implements Receiver
@@ -424,7 +429,7 @@
       mgr.begin();
 
       Connection conn = ds.getConnection();
-      String sql = "SELECT MESSAGEID, ORD FROM JMS_MESSAGE_REFERENCE WHERE CHANNELID=? ORDER BY ORD";
+      String sql = "SELECT MESSAGEID, ORD, PAGE_ORD FROM JMS_MESSAGE_REFERENCE WHERE CHANNELID=? ORDER BY PAGE_ORD";
       PreparedStatement ps = conn.prepareStatement(sql);
       ps.setLong(1, channelId);
    
@@ -435,6 +440,15 @@
       while (rs.next())
       {
          long msgId = rs.getLong(1);
+         long ord = rs.getLong(2);
+         long pageOrd = rs.getLong(3);
+         if (rs.wasNull())
+         {
+            log.info("!NULL");
+         }
+         
+         log.info("msgId: " + msgId + " ord: " + ord + " pageOrd: " + pageOrd);
+         
          msgIds.add(new Long(msgId));
       }
       rs.close();
@@ -451,7 +465,7 @@
       return msgIds;
    }
    
-   protected List getUnloadedReferenceIds(long channelId) throws Exception
+   protected List getPagedReferenceIds(long channelId) throws Exception
    {
       InitialContext ctx = new InitialContext();
 
@@ -462,7 +476,7 @@
       mgr.begin();
 
       Connection conn = ds.getConnection();
-      String sql = "SELECT MESSAGEID, ORD FROM JMS_MESSAGE_REFERENCE WHERE CHANNELID=? AND LOADED='N' ORDER BY ORD";
+      String sql = "SELECT MESSAGEID FROM JMS_MESSAGE_REFERENCE WHERE CHANNELID=? AND PAGE_ORD IS NOT NULL ORDER BY PAGE_ORD";
       PreparedStatement ps = conn.prepareStatement(sql);
       ps.setLong(1, channelId);
    

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_NP_2PCTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_NP_2PCTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_NP_2PCTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -851,9 +851,7 @@
       
       //Verify 13 deliveries
       assertEquals(13, queue.memoryDeliveryCount());;      
-      
-      
-   
+               
       //Cancel 3 more
       
       for (int i = 12; i > 9; i--)
@@ -890,12 +888,16 @@
       
       //Cancel the last 10
       
+      log.info("**** cancelling");
+      
       for (int i = 9; i >= 0; i--)
       {
          dels[i].cancel();
       }
       
+      log.info("**** cancelled");
       
+      
       //This should cause the down cache to be flushed
       
       //verify 20 ref in storage

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_2PCTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_2PCTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_2PCTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -87,7 +87,7 @@
       
       //verify no unloaded refs in storage
             
-      List refIds = getUnloadedReferenceIds(queue.getChannelID());
+      List refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 99 refs in storage
@@ -128,7 +128,7 @@
       
       //verify no unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 100 refs in storage
@@ -172,7 +172,7 @@
       
       //verify no unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 109 refs in storage
@@ -215,7 +215,7 @@
       
       //verify 10 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 100, 109);
       
@@ -257,7 +257,7 @@
       
       //verify 10 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 100, 109);
       
@@ -302,7 +302,7 @@
       
       //verify 20 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 100, 119);
       
@@ -358,7 +358,7 @@
       
       //verify 30 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(30, refIds.size());
       assertSameIds(refIds, refs, 100, 129);
       
@@ -404,7 +404,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -447,7 +447,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -485,7 +485,7 @@
 
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -527,7 +527,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -568,7 +568,7 @@
       
       //verify 21 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(21, refIds.size());
       assertSameIds(refIds, refs, 120, 140);
       
@@ -607,7 +607,7 @@
       
       //verify 1 unloaded ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(1, refIds.size());
       assertSameIds(refIds, refs, 140, 140);
       
@@ -646,7 +646,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 100 refs in storage
@@ -684,7 +684,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 80 refs in storage
@@ -722,7 +722,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 20 refs in storage
@@ -764,7 +764,7 @@
       tx.prepare();
       tx.commit();
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 40 refs in storage
@@ -807,7 +807,7 @@
       tx.prepare();
       tx.commit();
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 60 refs in storage
@@ -851,7 +851,7 @@
       
       //verify 20 unloaded ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 221, 240);
       
@@ -892,7 +892,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       // Verify 120 refs in storage
@@ -930,7 +930,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       // Verify 120 refs in storage
@@ -968,7 +968,7 @@
       
       //verify 10 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 231, 240);
       
@@ -1009,7 +1009,7 @@
       
       //verify 20 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 221, 240);
       
@@ -1047,7 +1047,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());     
       
       // Verify 70 refs in storage
@@ -1082,7 +1082,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());     
       
       refIds = getReferenceIds(queue.getChannelID());

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_NTTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_NTTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_NTTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -83,7 +83,7 @@
       
       //verify no unloaded refs in storage
             
-      List refIds = getUnloadedReferenceIds(queue.getChannelID());
+      List refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 99 refs in storage
@@ -121,7 +121,7 @@
       
       //verify no unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 100 refs in storage
@@ -162,7 +162,7 @@
       
       //verify no unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 109 refs in storage
@@ -199,7 +199,7 @@
       
       //verify 10 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 100, 109);
       
@@ -239,7 +239,7 @@
       
       //verify 10 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 100, 109);
       
@@ -282,7 +282,7 @@
       
       //verify 20 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 100, 119);
       
@@ -326,7 +326,7 @@
       
       //verify 30 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(30, refIds.size());
       assertSameIds(refIds, refs, 100, 129);
       
@@ -370,7 +370,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -411,7 +411,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -450,7 +450,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -491,7 +491,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -532,7 +532,7 @@
       
       //verify 21 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(21, refIds.size());
       assertSameIds(refIds, refs, 120, 140);
       
@@ -571,7 +571,7 @@
       
       //verify 1 unloaded ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(1, refIds.size());
       assertSameIds(refIds, refs, 140, 140);
       
@@ -610,7 +610,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 100 refs in storage
@@ -648,7 +648,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 80 refs in storage
@@ -685,7 +685,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 20 refs in storage
@@ -724,7 +724,7 @@
          refs[i].releaseMemoryReference();
       }
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 40 refs in storage
@@ -764,7 +764,7 @@
          refs[i].releaseMemoryReference();
       }
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 60 refs in storage
@@ -805,7 +805,7 @@
       
       //verify 20 unloaded ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 221, 240);
       
@@ -846,7 +846,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       // Verify 120 refs in storage
@@ -884,7 +884,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       // Verify 120 refs in storage
@@ -922,7 +922,7 @@
       
       //verify 10 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 231, 240);
       
@@ -963,7 +963,7 @@
       
       //verify 20 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 221, 240);
       
@@ -1001,7 +1001,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());     
       
       // Verify 70 refs in storage
@@ -1036,7 +1036,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());     
       
       refIds = getReferenceIds(queue.getChannelID());

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_TTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_TTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_P_TTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -86,7 +86,7 @@
       
       //verify no unloaded refs in storage
             
-      List refIds = getUnloadedReferenceIds(queue.getChannelID());
+      List refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 99 refs in storage
@@ -126,7 +126,7 @@
       
       //verify no unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 100 refs in storage
@@ -169,7 +169,7 @@
       
       //verify no unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertTrue(refIds.isEmpty());
       
       //verify 109 refs in storage
@@ -211,7 +211,7 @@
       
       //verify 10 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 100, 109);
       
@@ -252,7 +252,7 @@
       
       //verify 10 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 100, 109);
       
@@ -296,7 +296,7 @@
       
       //verify 20 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 100, 119);
       
@@ -341,7 +341,7 @@
       
       //verify 30 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(30, refIds.size());
       assertSameIds(refIds, refs, 100, 129);
       
@@ -395,7 +395,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -437,7 +437,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -475,7 +475,7 @@
 
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -517,7 +517,7 @@
       
       //verify 40 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(40, refIds.size());
       assertSameIds(refIds, refs, 100, 139);
       
@@ -558,7 +558,7 @@
       
       //verify 21 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(21, refIds.size());
       assertSameIds(refIds, refs, 120, 140);
       
@@ -597,7 +597,7 @@
       
       //verify 1 unloaded ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(1, refIds.size());
       assertSameIds(refIds, refs, 140, 140);
       
@@ -636,7 +636,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 100 refs in storage
@@ -674,7 +674,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 80 refs in storage
@@ -712,7 +712,7 @@
       
       //verify 0 unloaded refs in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 20 refs in storage
@@ -753,7 +753,7 @@
       }
       tx.commit();
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 40 refs in storage
@@ -795,7 +795,7 @@
       }
       tx.commit();
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       //Verify 60 refs in storage
@@ -838,7 +838,7 @@
       
       //verify 20 unloaded ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 221, 240);
       
@@ -879,7 +879,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       // Verify 120 refs in storage
@@ -917,7 +917,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());
       
       // Verify 120 refs in storage
@@ -955,7 +955,7 @@
       
       //verify 10 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(10, refIds.size());
       assertSameIds(refIds, refs, 231, 240);
       
@@ -996,7 +996,7 @@
       
       //verify 20 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(20, refIds.size());
       assertSameIds(refIds, refs, 221, 240);
       
@@ -1034,7 +1034,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());     
       
       // Verify 70 refs in storage
@@ -1069,7 +1069,7 @@
       
       //verify 0 ref in storage
       
-      refIds = getUnloadedReferenceIds(queue.getChannelID());
+      refIds = getPagedReferenceIds(queue.getChannelID());
       assertEquals(0, refIds.size());     
       
       refIds = getReferenceIds(queue.getChannelID());

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -326,6 +326,12 @@
       
       assertEquals(0, queue.memoryDeliveryCount());
       
+      //Also we cancel some so we make sure that we have some negative page orders
+      
+      //cancel 10
+      
+      this.cancelDeliveries(queue, 10);
+      
       //Stop and restart the persistence manager
 
       pm.stop();
@@ -414,6 +420,12 @@
       
       assertEquals(0, queue.memoryDeliveryCount());
       
+      //Also we cancel some so we make sure that we have some negative page orders
+      
+      //cancel 10
+      
+      this.cancelDeliveries(queue, 10);
+      
       //Stop and restart the persistence manager
 
       pm.stop();

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/ClusteredTopicExchangeTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/ClusteredTopicExchangeTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/ClusteredTopicExchangeTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -74,32 +74,46 @@
       super.tearDown();
    }
    
-   //For the following tests create a simple receiver and acknowledge messages properly rather
-   //than relying on removeAllReferences
+   public final void testBindSameName() throws Throwable
+   {
+      Exchange exchange1 = null;
+      
+      Exchange exchange2 = null;
+      
+      try
+      {         
+         exchange1 = createExchange("node1", "testgroup");
+         
+         exchange2 = createExchange("node2", "testgroup");
+         
+         exchange1.bindQueue("sub1", "topic1", null, false, false, ms, pm, 20000, 100, 100);
+         
+         try
+         {
+            exchange2.bindQueue("sub1", "topic1", null, false, false, ms, pm, 20000, 100, 100);
+            fail();
+         }
+         catch (IllegalArgumentException e)
+         {
+            //OK - this should fail
+         }
+      }
+      finally
+      {
+         if (exchange1 != null)
+         {
+            exchange1.stop();
+         }
+         
+         if (exchange2 != null)
+         {
+            exchange2.stop();
+         }
+      }
+   }
    
-   //testBindUnbind - bind and unbind on different nodes as members join and leave, make sure the correct state
-   //is replicated - make sure durable bindings remain durable
    
-   //non transactional route
-   //create several subscriptions same durable some non durable on different nodes
-   //route messages with no tx - make sure it arrives ok - make sure messages arrive in durable
-   //subs even if node is shutdown and restarted
-   
-   //as above but transactional
-   
-   //test that activate etc is local only
-   
-   //test that can't bind twice with same name across cluster
-   
-   //test that can't do exchange operations on an exchange that is stopped
-   
-   //start and stop exchanges concurrently to test for race conditions
-   
-   //Need to add tests for queue/topic with selector
-   
-   //Need to route with peristent and non persistent messages
-   
-   public void testClusteredBindUnbind() throws Throwable
+   public final void testClusteredBindUnbind() throws Throwable
    {
       Exchange exchange1 = null;
       
@@ -155,6 +169,8 @@
          
          Binding binding4 = exchange2.bindQueue("sub4", "topic1", null, false, false, ms, pm, 20000, 100, 100);
          
+         log.info("here 1");
+         
          // Make sure both nodes pick it up
          
          bindings = exchange1.listBindingsForWildcard("topic1");
@@ -164,7 +180,7 @@
          assertEquivalent(binding1, (Binding)bindings.get(0));
          assertEquivalent(binding2, (Binding)bindings.get(1));
          assertEquivalent(binding3, (Binding)bindings.get(2));
-         assertEquivalent(binding4, (Binding)bindings.get(2));
+         assertEquivalent(binding4, (Binding)bindings.get(3));
          
          bindings = exchange2.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
@@ -190,14 +206,14 @@
    
          bindings = exchange2.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
-         assertEquals(4, bindings.size());
+         assertEquals(2, bindings.size());
          
          assertEquivalent(binding3, (Binding)bindings.get(0));
          assertEquivalent(binding4, (Binding)bindings.get(1));
          
          //Add a third exchange
                   
-         exchange1 = createExchange("node3", "testgroup");
+         exchange3 = createExchange("node3", "testgroup");
          
          //Maks sure it picks up the bindings
          
@@ -238,60 +254,75 @@
          assertEquivalent(binding4, (Binding)bindings.get(1));
          assertEquivalent(binding5, (Binding)bindings.get(2));
          
-         //Add a durable binding on node 1
+         //Add a durable and a non durable binding on node 1
          
          Binding binding6 = exchange1.bindQueue("sub6", "topic1", null, false, true, ms, pm, 20000, 100, 100);
          
-         // Make sure all nodes pick it up
+         Binding binding7 = exchange1.bindQueue("sub7", "topic1", null, false, false, ms, pm, 20000, 100, 100);
          
+         // Make sure all nodes pick them up
+         
          bindings = exchange1.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
-         assertEquals(4, bindings.size());
+         assertEquals(5, bindings.size());
          
          assertEquivalent(binding3, (Binding)bindings.get(0));
          assertEquivalent(binding4, (Binding)bindings.get(1));
          assertEquivalent(binding5, (Binding)bindings.get(2));
          assertEquivalent(binding6, (Binding)bindings.get(3));
+         assertEquivalent(binding7, (Binding)bindings.get(4));
          
          bindings = exchange2.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
-         assertEquals(4, bindings.size());
+         assertEquals(5, bindings.size());
          
          assertEquivalent(binding3, (Binding)bindings.get(0));
          assertEquivalent(binding4, (Binding)bindings.get(1));
          assertEquivalent(binding5, (Binding)bindings.get(2));
          assertEquivalent(binding6, (Binding)bindings.get(3));
+         assertEquivalent(binding7, (Binding)bindings.get(4));
          
          bindings = exchange3.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
-         assertEquals(4, bindings.size());
+         assertEquals(5, bindings.size());
          
          assertEquivalent(binding3, (Binding)bindings.get(0));
          assertEquivalent(binding4, (Binding)bindings.get(1));
          assertEquivalent(binding5, (Binding)bindings.get(2));
          assertEquivalent(binding6, (Binding)bindings.get(3));
-         
+         assertEquivalent(binding7, (Binding)bindings.get(4));
+               
+         log.info("Stopping exchange 1");
          //Stop exchange 1
          exchange1.stop();
+         log.info("Stopped exchange 1");
          
+         //Need to sleep since it may take some time for the view changed request to reach the
+         //members which causes the bindings to be removed
+         
+         Thread.sleep(1000);
+         
          //All it's non durable bindings should be removed from the other nodes
          //Durable bindings should remain
          
+         log.info("getting bindingd for wildcard");
          bindings = exchange2.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
-         assertEquals(3, bindings.size());
+         assertEquals(4, bindings.size());
          
          assertEquivalent(binding3, (Binding)bindings.get(0));
          assertEquivalent(binding4, (Binding)bindings.get(1));
          assertEquivalent(binding5, (Binding)bindings.get(2));
+         assertEquivalent(binding6, (Binding)bindings.get(3));
          
          bindings = exchange3.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
-         assertEquals(3, bindings.size());
+         assertEquals(4, bindings.size());
          
          assertEquivalent(binding3, (Binding)bindings.get(0));
          assertEquivalent(binding4, (Binding)bindings.get(1));
          assertEquivalent(binding5, (Binding)bindings.get(2));
+         assertEquivalent(binding6, (Binding)bindings.get(3));
          
          //Stop exchange 2
          exchange2.stop();
@@ -300,34 +331,34 @@
          assertNotNull(bindings);
          assertEquals(2, bindings.size());
          
-         assertEquivalent(binding4, (Binding)bindings.get(0));
-         assertEquivalent(binding5, (Binding)bindings.get(1));
+         assertEquivalent(binding5, (Binding)bindings.get(0));
+         assertEquivalent(binding6, (Binding)bindings.get(1));
          
          //Restart exchange 1 and exchange 2
-         exchange1.start();
+         exchange1 = createExchange("node1", "testgroup");
          
-         exchange2.start();
+         exchange2 = createExchange("node2", "testgroup");
          
          bindings = exchange1.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
          assertEquals(2, bindings.size());
          
-         assertEquivalent(binding4, (Binding)bindings.get(0));
-         assertEquivalent(binding5, (Binding)bindings.get(1));
+         assertEquivalent(binding5, (Binding)bindings.get(0));
+         assertEquivalent(binding6, (Binding)bindings.get(1));
          
          bindings = exchange2.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
          assertEquals(2, bindings.size());
          
-         assertEquivalent(binding4, (Binding)bindings.get(0));
-         assertEquivalent(binding5, (Binding)bindings.get(1));
+         assertEquivalent(binding5, (Binding)bindings.get(0));
+         assertEquivalent(binding6, (Binding)bindings.get(1));
          
          bindings = exchange3.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
          assertEquals(2, bindings.size());
          
-         assertEquivalent(binding4, (Binding)bindings.get(0));
-         assertEquivalent(binding5, (Binding)bindings.get(1));
+         assertEquivalent(binding5, (Binding)bindings.get(0));
+         assertEquivalent(binding6, (Binding)bindings.get(1));
          
          //Stop all exchanges
          
@@ -336,9 +367,9 @@
          exchange3.stop();
          
          //Start them all
-         exchange1.start();
-         exchange2.start();
-         exchange3.start();
+         exchange1 = createExchange("node1", "testgroup");
+         exchange2 = createExchange("node2", "testgroup");
+         exchange3 = createExchange("node3", "testgroup");
          
          //Only the durable queue should survive
          
@@ -346,24 +377,27 @@
          assertNotNull(bindings);
          assertEquals(1, bindings.size());
          
-         assertEquivalent(binding5, (Binding)bindings.get(0));
+         assertEquivalent(binding6, (Binding)bindings.get(0));
          
          bindings = exchange2.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
          assertEquals(1, bindings.size());
          
-         assertEquivalent(binding5, (Binding)bindings.get(0));
+         assertEquivalent(binding6, (Binding)bindings.get(0));
          
          bindings = exchange3.listBindingsForWildcard("topic1");
          assertNotNull(bindings);
          assertEquals(1, bindings.size());
          
-         assertEquivalent(binding5, (Binding)bindings.get(0));
+         assertEquivalent(binding6, (Binding)bindings.get(0));
+                  
       }
       finally
       {
          if (exchange1 != null)
          {
+            exchange1.reloadQueues("topic1", ms, pm, 1000, 20, 20);
+            exchange1.unbindQueue("sub6");
             exchange1.stop();
          }
          
@@ -380,22 +414,44 @@
       
    }
    
-   public void testClusteredRoute() throws Throwable
+   public final void testClusteredRoutePersistent() throws Throwable
    {
+      clusteredRoute(true);
+   }
+   
+   public final void testClusteredRouteNonPersistent() throws Throwable
+   {
+      clusteredRoute(false);
+   }
+   
+   public final void testClusteredTransactionalRoutePersistent() throws Throwable
+   {
+      clusteredTransactionalRoute(true);
+   }
+   
+   public final void testClusteredTransactionalRouteNonPersistent() throws Throwable
+   {
+      clusteredTransactionalRoute(false);
+   }
+   
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+   
+
+   protected void clusteredRoute(boolean persistentMessage) throws Throwable
+   {
       Exchange exchange1 = null;
       
       Exchange exchange2 = null;
-      
-      Exchange exchange3 = null;
-      
+          
       try
       {   
-         //Start three exchanges
+         //Start two exchanges
          
-         exchange1.start();
-         exchange2.start();
-         exchange3.start();
-         
+         exchange1 = createExchange("node1", "testgroup");
+         exchange2 = createExchange("node2", "testgroup");
+      
          //Two topics with a mixture of durable and non durable subscriptions
          
          Binding[] bindings = new Binding[16];
@@ -411,16 +467,16 @@
          bindings[6] = exchange1.bindQueue("sub7", "topic1", null, false, true, ms, pm, 20000, 100, 100);
          bindings[7] = exchange1.bindQueue("sub8", "topic1", null, false, true, ms, pm, 20000, 100, 100);
                   
-         bindings[8] = exchange1.bindQueue("sub1", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
-         bindings[9] = exchange1.bindQueue("sub2", "topic2", null, false, false, ms, pm, 20000, 100, 100);
+         bindings[8] = exchange1.bindQueue("sub9", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[9] = exchange1.bindQueue("sub10", "topic2", null, false, false, ms, pm, 20000, 100, 100);
          
-         bindings[10] = exchange2.bindQueue("sub3", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
-         bindings[11] = exchange2.bindQueue("sub4", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
-         bindings[12] = exchange2.bindQueue("sub5", "topic2", null, false, true, ms, pm, 20000, 100, 100);      
+         bindings[10] = exchange2.bindQueue("sub11", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[11] = exchange2.bindQueue("sub12", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[12] = exchange2.bindQueue("sub13", "topic2", null, false, true, ms, pm, 20000, 100, 100);      
          
-         bindings[13] = exchange1.bindQueue("sub6", "topic2", null, false, false, ms, pm, 20000, 100, 100);
-         bindings[14] = exchange1.bindQueue("sub7", "topic2", null, false, true, ms, pm, 20000, 100, 100);
-         bindings[15] = exchange1.bindQueue("sub8", "topic2", null, false, true, ms, pm, 20000, 100, 100);
+         bindings[13] = exchange1.bindQueue("sub14", "topic2", null, false, false, ms, pm, 20000, 100, 100);
+         bindings[14] = exchange1.bindQueue("sub15", "topic2", null, false, true, ms, pm, 20000, 100, 100);
+         bindings[15] = exchange1.bindQueue("sub16", "topic2", null, false, true, ms, pm, 20000, 100, 100);
     
          MessageQueue[] queues = new MessageQueue[16];
          SimpleReceiver[] receivers = new SimpleReceiver[16];
@@ -428,157 +484,89 @@
          for (int i = 0; i < 16; i++)
          {
             queues[i] = bindings[i].getQueue();
-            receivers[i] = new SimpleReceiver(SimpleReceiver.ACCEPTING);
+            receivers[i] = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);
+            queues[i].add(receivers[i]);
          }
          
-         Message msg1 = MessageFactory.createCoreMessage(1);      
-         MessageReference ref1 = ms.reference(msg1);         
+         Message msg = MessageFactory.createCoreMessage(1, persistentMessage, null);      
+         MessageReference ref = ms.reference(msg);         
 
-         boolean routed = exchange1.route(ref1, "topic1", null);         
+         boolean routed = exchange1.route(ref, "topic1", null);         
          assertTrue(routed);
          
-         List msgs = receivers[0].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         Message msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[0].acknowledge(msgRec, null);
-         msgs = queues[0].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
+         //Messages are sent asych so may take some finite time to arrive
+         Thread.sleep(1000);
          
-         msgs = receivers[1].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[1].acknowledge(msgRec, null);
-         msgs = queues[1].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
+         for (int i = 0; i < 8; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(1, msgs.size());
+            Message msgRec = (Message)msgs.get(0);
+            assertEquals(msg.getMessageID(), msgRec.getMessageID());
+            receivers[i].acknowledge(msgRec, null);
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty()); 
+            receivers[i].clear();
+         }
          
-         msgs = receivers[2].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[2].acknowledge(msgRec, null);
-         msgs = queues[2].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
+         for (int i = 8; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+                  
+         //Now route to topic2
          
-         msgs = receivers[3].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[3].acknowledge(msgRec, null);
-         msgs = queues[3].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
+         msg = MessageFactory.createCoreMessage(2, persistentMessage, null);;      
+         ref = ms.reference(msg);         
+
+         routed = exchange1.route(ref, "topic2", null);         
+         assertTrue(routed);
+         //Messages are sent asych so may take some finite time to arrive
+         Thread.sleep(1000);
          
-         msgs = receivers[4].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[4].acknowledge(msgRec, null);
-         msgs = queues[4].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
+         for (int i = 0; i < 8; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
          
-         msgs = receivers[5].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[5].acknowledge(msgRec, null);
-         msgs = queues[5].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
-         
-         msgs = receivers[6].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[6].acknowledge(msgRec, null);
-         msgs = queues[6].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
-         
-         msgs = receivers[7].getMessages();
-         assertNotNull(msgs);
-         assertEquals(1, msgs.size());
-         msgRec = (Message)msgs.get(0);
-         assertEquals(msg1.getMessageID(), msgRec.getMessageID());
-         receivers[7].acknowledge(msgRec, null);
-         msgs = queues[7].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty()); 
-         
-         msgs = receivers[8].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[8].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         msgs = receivers[9].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[9].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         msgs = receivers[10].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[10].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         msgs = receivers[11].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[11].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         msgs = receivers[12].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[12].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         msgs = receivers[13].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[13].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         msgs = receivers[14].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[14].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         msgs = receivers[15].getMessages();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         msgs = queues[15].browse();
-         assertNotNull(msgs);
-         assertTrue(msgs.isEmpty());
-         
-         
+         for (int i = 8; i < 16; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(1, msgs.size());
+            Message msgRec = (Message)msgs.get(0);
+            assertEquals(msg.getMessageID(), msgRec.getMessageID());
+            receivers[i].acknowledge(msgRec, null);
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty()); 
+            receivers[i].clear();
+         }
+
       }
       finally
       {
          if (exchange1 != null)
          {
+            exchange2.unbindQueue("sub5");
+            exchange1.unbindQueue("sub7");
+            exchange1.unbindQueue("sub8");
+            exchange2.unbindQueue("sub13");
+            exchange1.unbindQueue("sub15");
+            exchange1.unbindQueue("sub16");
+            
             exchange1.stop();
          }
          
@@ -586,54 +574,580 @@
          {
             exchange2.stop();
          }
-         
-         if (exchange3 != null)
-         {
-            exchange2.stop();
-         }
       }
    }
    
    
-
-   
-   public void testClusteredTopic() throws Exception
+   protected void clusteredTransactionalRoute(boolean persistent) throws Throwable
    {
       Exchange exchange1 = null;
       
       Exchange exchange2 = null;
       
       try
-      {         
+      {   
+         //Start two exchanges
+         
          exchange1 = createExchange("node1", "testgroup");
+         exchange2 = createExchange("node2", "testgroup");
+
          
-         Binding binding1 = exchange1.bindQueue("sub1", "topic1", null, false, true, ms, pm, 20000, 100, 100);
+         //Two topics with a mixture of durable and non durable subscriptions
          
-         exchange2 = createExchange("node2", "testgroup");
+         Binding[] bindings = new Binding[16];
          
-         Binding binding2 = exchange1.bindQueue("sub2", "topic1", null, false, true, ms, pm, 20000, 100, 100);
+         bindings[0] = exchange1.bindQueue("sub1", "topic1", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[1] = exchange1.bindQueue("sub2", "topic1", null, false, false, ms, pm, 20000, 100, 100);
          
-         Binding binding3 = exchange2.bindQueue("sub3", "topic1", null, false, true, ms, pm, 20000, 100, 100);
+         bindings[2] = exchange2.bindQueue("sub3", "topic1", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[3] = exchange2.bindQueue("sub4", "topic1", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[4] = exchange2.bindQueue("sub5", "topic1", null, false, true, ms, pm, 20000, 100, 100);      
          
-         Message msg1 = MessageFactory.createCoreMessage(1);      
+         bindings[5] = exchange1.bindQueue("sub6", "topic1", null, false, false, ms, pm, 20000, 100, 100);
+         bindings[6] = exchange1.bindQueue("sub7", "topic1", null, false, true, ms, pm, 20000, 100, 100);
+         bindings[7] = exchange1.bindQueue("sub8", "topic1", null, false, true, ms, pm, 20000, 100, 100);
+                  
+         bindings[8] = exchange1.bindQueue("sub9", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[9] = exchange1.bindQueue("sub10", "topic2", null, false, false, ms, pm, 20000, 100, 100);
+         
+         bindings[10] = exchange2.bindQueue("sub11", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[11] = exchange2.bindQueue("sub12", "topic2", null, false, false, ms, pm, 20000, 100, 100);         
+         bindings[12] = exchange2.bindQueue("sub13", "topic2", null, false, true, ms, pm, 20000, 100, 100);      
+         
+         bindings[13] = exchange1.bindQueue("sub14", "topic2", null, false, false, ms, pm, 20000, 100, 100);
+         bindings[14] = exchange1.bindQueue("sub15", "topic2", null, false, true, ms, pm, 20000, 100, 100);
+         bindings[15] = exchange1.bindQueue("sub16", "topic2", null, false, true, ms, pm, 20000, 100, 100);
+    
+         MessageQueue[] queues = new MessageQueue[16];
+         SimpleReceiver[] receivers = new SimpleReceiver[16];
+         
+         for (int i = 0; i < 16; i++)
+         {
+            queues[i] = bindings[i].getQueue();
+            receivers[i] = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);
+            queues[i].add(receivers[i]);
+         }
+         
+         //First for topic 1
+         
+         Message msg1 = MessageFactory.createCoreMessage(1, persistent, null);;      
          MessageReference ref1 = ms.reference(msg1);
          
-         boolean routed = exchange1.route(ref1, "topic1", null); 
+         Message msg2 = MessageFactory.createCoreMessage(2, persistent, null);;      
+         MessageReference ref2 = ms.reference(msg2);
          
-         //For non reliable messages may take little while for messages to arrive
-         //Since they are just put on the bus and the caller continues - so we sleep
-         Thread.sleep(500);
+         Transaction tx = tr.createTransaction();
+
+         boolean routed = exchange1.route(ref1, "topic1", tx);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic1", tx);         
+         assertTrue(routed);
+
          
-         checkQueueContainsRef(binding1, ref1);
-         checkQueueContainsRef(binding2, ref1);
-         checkQueueContainsRef(binding3, ref1);
+         for (int i = 0; i < 16; i++)
+         {
+            log.info("i is: " + i);
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
          
-         log.info("Done test");
+         tx.commit();
+         
+         //Messages are sent asych so may take some finite time to arrive
+         Thread.sleep(1000);
+         
+         for (int i = 0; i < 8; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());            
+            receivers[i].acknowledge(msgRec1, null);
+            receivers[i].acknowledge(msgRec2, null);
+            msgs = queues[i].browse();
+            assertNotNull(msgs);            
+            assertTrue(msgs.isEmpty());                        
+            receivers[i].clear();
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         msg1 = MessageFactory.createCoreMessage(1, persistent, null);;      
+         ref1 = ms.reference(msg1);
+         
+         msg2 = MessageFactory.createCoreMessage(2, persistent, null);;      
+         ref2 = ms.reference(msg2);
+         
+         tx = tr.createTransaction();
+
+         routed = exchange1.route(ref1, "topic1", tx);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic1", tx);         
+         assertTrue(routed);
+         
+         //Messages are sent asych so may take some finite time to arrive
+         Thread.sleep(1000);         
+         
+         for (int i = 0; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         tx.rollback();
+         
+         for (int i = 0; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         //Now send some non transactionally
+         
+         msg1 = MessageFactory.createCoreMessage(1, persistent, null);
+         ref1 = ms.reference(msg1);
+         
+         msg2 = MessageFactory.createCoreMessage(2, persistent, null);
+         ref2 = ms.reference(msg2);
+         
+         routed = exchange1.route(ref1, "topic1", null);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic1", null);         
+         assertTrue(routed);
+         
+         //Messages are sent asych so may take some finite time to arrive
+         Thread.sleep(1000);         
+         
+         //And acknowledge transactionally
+         
+         tx = tr.createTransaction();
+         
+         for (int i = 0; i < 8; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());      
+                        
+            receivers[i].acknowledge(msgRec1, tx);
+            receivers[i].acknowledge(msgRec2, tx);
+                        
+            msgs = queues[i].browse();
+            
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());
+            
+            receivers[i].clear();
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         log.info("*** COMMITTING THE TX");
+         tx.commit();
+         log.info("*** COMMITTED THE TX");
+         
+         for (int i = 0; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         
+         // and the rollback
+         
+         msg1 = MessageFactory.createCoreMessage(1, persistent, null);;      
+         ref1 = ms.reference(msg1);
+         
+         msg2 = MessageFactory.createCoreMessage(2, persistent, null);;      
+         ref2 = ms.reference(msg2);
+         
+         routed = exchange1.route(ref1, "topic1", null);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic1", null);         
+         assertTrue(routed);
+         
+         Thread.sleep(1000);
+                 
+         tx = tr.createTransaction();
+         
+         for (int i = 0; i < 8; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());      
+                        
+            receivers[i].acknowledge(msgRec1, tx);
+            receivers[i].acknowledge(msgRec2, tx);
+                        
+            msgs = queues[i].browse();
+            
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());
+            
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         tx.rollback();
+         
+         for (int i = 0; i < 8; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());      
+                                 
+            msgs = queues[i].browse();
+            
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());
+            
+            receivers[i].acknowledge(msgRec1, null);
+            receivers[i].acknowledge(msgRec2, null);
+                           
+            receivers[i].clear();
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         
+         // Now for topic 2
+         
+         msg1 = MessageFactory.createCoreMessage(1, persistent, null);    
+         ref1 = ms.reference(msg1);
+         
+         msg2 = MessageFactory.createCoreMessage(2, persistent, null);     
+         ref2 = ms.reference(msg2);
+         
+         tx = tr.createTransaction();
+
+         routed = exchange1.route(ref1, "topic2", tx);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic2", tx);         
+         assertTrue(routed);
+         
+         
+         
+         for (int i = 0; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         tx.commit();
+         
+         //Messages are sent asych so may take some finite time to arrive
+         Thread.sleep(1000);
+         
+         for (int i = 0; i < 8; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());            
+            receivers[i].acknowledge(msgRec1, null);
+            receivers[i].acknowledge(msgRec2, null);
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty()); 
+            receivers[i].clear();
+         }
+         
+         msg1 = MessageFactory.createCoreMessage(1, persistent, null);;      
+         ref1 = ms.reference(msg1);
+         
+         msg2 = MessageFactory.createCoreMessage(2, persistent, null);;      
+         ref2 = ms.reference(msg2);
+         
+         tx = tr.createTransaction();
+
+         routed = exchange1.route(ref1, "topic1", tx);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic1", tx);         
+         assertTrue(routed);
+         
+         for (int i = 0; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         tx.rollback();
+         
+         for (int i = 0; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         //Now send some non transactionally
+         
+         msg1 = MessageFactory.createCoreMessage(1, persistent, null);      
+         ref1 = ms.reference(msg1);
+         
+         msg2 = MessageFactory.createCoreMessage(2, persistent, null);      
+         ref2 = ms.reference(msg2);
+         
+         routed = exchange1.route(ref1, "topic2", null);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic2", null);         
+         assertTrue(routed);
+         
+         Thread.sleep(1000);
+         
+         //And acknowledge transactionally
+         
+         tx = tr.createTransaction();
+         
+         for (int i = 0; i < 8; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());      
+                        
+            receivers[i].acknowledge(msgRec1, tx);
+            receivers[i].acknowledge(msgRec2, tx);
+                        
+            msgs = queues[i].browse();
+            
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());
+            
+            receivers[i].clear();
+         }
+         
+         
+         
+         tx.commit();
+         
+         for (int i = 0; i < 16; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         
+         // and the rollback
+         
+         msg1 = MessageFactory.createCoreMessage(1, persistent, null);;      
+         ref1 = ms.reference(msg1);
+         
+         msg2 = MessageFactory.createCoreMessage(2, persistent, null);;      
+         ref2 = ms.reference(msg2);
+         
+         routed = exchange1.route(ref1, "topic2", null);         
+         assertTrue(routed);
+         routed = exchange1.route(ref2, "topic2", null);         
+         assertTrue(routed);
+         
+         Thread.sleep(1000);
+          
+         tx = tr.createTransaction();
+         
+         for (int i = 0; i < 8; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());      
+            
+            
+            receivers[i].acknowledge(msgRec1, tx);
+            receivers[i].acknowledge(msgRec2, tx);
+            
+            
+            msgs = queues[i].browse();
+            
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());
+         }
+         
+         
+         
+         tx.rollback();
+         
+         for (int i = 0; i < 8; i++)
+         {
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+            msgs = queues[i].browse();
+            assertNotNull(msgs);
+            assertTrue(msgs.isEmpty());
+         }
+         
+         for (int i = 8; i < 16; i++)
+         {         
+            List msgs = receivers[i].getMessages();
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            Message msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            Message msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());      
+                                              
+            msgs = queues[i].browse();
+            
+            assertNotNull(msgs);
+            assertEquals(2, msgs.size());
+            msgRec1 = (Message)msgs.get(0);
+            assertEquals(msg1.getMessageID(), msgRec1.getMessageID());
+            msgRec2 = (Message)msgs.get(1);
+            assertEquals(msg2.getMessageID(), msgRec2.getMessageID());
+            
+            receivers[i].acknowledge(msgRec1, null);
+            receivers[i].acknowledge(msgRec2, null);             
+            
+            receivers[i].clear();
+         }
       }
       finally
       {
          if (exchange1 != null)
          {
+            exchange2.unbindQueue("sub5");
+            exchange1.unbindQueue("sub7");
+            exchange1.unbindQueue("sub8");
+            exchange2.unbindQueue("sub13");
+            exchange1.unbindQueue("sub15");
+            exchange1.unbindQueue("sub16");
             exchange1.stop();
          }
          
@@ -644,25 +1158,6 @@
       }
    }
    
-   private void checkQueueContainsRef(Binding binding, MessageReference ref)
-   {
-      MessageQueue queue = binding.getQueue();
-      
-      List refs = queue.browse();
-      
-      assertNotNull(refs);
-      
-      assertEquals(1, refs.size());
-      
-      Message msg = (Message)refs.get(0);
-      
-      assertEquals(ref.getMessageID(), msg.getMessageID());
-   }
-
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-   
    protected Exchange createExchange() throws Exception
    {
       ClusteredTopicExchange exchange = new ClusteredTopicExchange(sc.getDataSource(), sc.getTransactionManager());

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/DirectExchangeTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/DirectExchangeTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/DirectExchangeTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -72,69 +72,46 @@
       super.tearDown();
    }
    
-   public final void testRoute() throws Throwable
+   public final void testRouteNPMessageNDQueue() throws Throwable
    {
-      Exchange exchange = createExchange();
+      route(false, false);
+   }
+   
+   public final void testRouteNPMessageDQueue() throws Throwable
+   {
+      route(false, true);
+   }
+   
+   public final void testRoutePMessageNDQueue() throws Throwable
+   {
+      route(true, false);
+   }
+   
+   public final void testRoutePMessageDQueue() throws Throwable
+   {
+      route(true, true);
+   }
       
-      Binding binding1 =
-         exchange.bindQueue("queue1", "queue1", null, false, true, ms, pm, 1000, 20, 20);      
-      Binding binding2 =
-         exchange.bindQueue("queue2", "queue2", null, false, true, ms, pm, 1000, 20, 20);
-      
-      MessageQueue queue1 = binding1.getQueue();      
-      MessageQueue queue2 = binding2.getQueue();
-      SimpleReceiver receiver1 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue1.add(receiver1);
-      SimpleReceiver receiver2 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue1.add(receiver2);
-      
-      assertTrue(binding1.isActive());      
-      assertTrue(binding2.isActive());
-      
-      Message msg1 = MessageFactory.createCoreMessage(1);      
-      MessageReference ref1 = ms.reference(msg1);
-      
-      boolean routed = exchange.route(ref1, "queue1", null);      
-      assertTrue(routed);
-      
-      List msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      Message msgRec = (Message)msgs.get(0);
-      assertTrue(msg1 == msgRec);
-      receiver1.acknowledge(msgRec, null);
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());      
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      receiver1.clear();
-      receiver2.clear();
-      
-      Message msg2 = MessageFactory.createCoreMessage(2);      
-      MessageReference ref2 = ms.reference(msg2);
-      
-      routed = exchange.route(ref2, "queue2", null);      
-      assertTrue(routed);
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      msgRec = (Message)msgs.get(0);
-      assertTrue(msg2 == msgRec);
-      receiver2.acknowledge(msgRec, null);
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
+   public final void testRouteTransactionalNPMessageNDQueue() throws Throwable
+   {
+      routeTransactional(false, false);
    }
    
+   public final void testRouteTransactionalNPMessageDQueue() throws Throwable
+   {
+      routeTransactional(false, true);
+   }
+   
+   public final void testRouteTransactionalPMessageNDQueue() throws Throwable
+   {
+      routeTransactional(true, false);
+   }
+   
+   public final void testRouteTransactionalPMessageDQueue() throws Throwable
+   {
+      routeTransactional(true, true);
+   }
+      
    public final void testRouteInactive() throws Throwable
    {
       Exchange exchange = createExchange();
@@ -146,16 +123,16 @@
       
       MessageQueue queue1 = binding1.getQueue();
       MessageQueue queue2 = binding2.getQueue();
-      SimpleReceiver receiver1 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
+      SimpleReceiver receiver1 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);
       queue1.add(receiver1);
-      SimpleReceiver receiver2 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue1.add(receiver2);
+      SimpleReceiver receiver2 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);
+      queue2.add(receiver2);
       
       //Now make one bindings inactive
       binding1.deactivate();
       
       assertFalse(binding1.isActive());
-      assertFalse(binding2.isActive());
+      assertTrue(binding2.isActive());
       
       Message msg1 = MessageFactory.createCoreMessage(1);      
       MessageReference ref1 = ms.reference(msg1);
@@ -219,23 +196,30 @@
       assertTrue(msgs.isEmpty());             
    }
    
-   public final void testRouteTransactional() throws Throwable
+   
+   
+
+   // Package protected ---------------------------------------------
+    
+   // Protected -----------------------------------------------------
+   
+   protected void routeTransactional(boolean persistentMessage, boolean durableQueue) throws Throwable
    {
       Exchange exchange = createExchange();
       
       Binding binding1 =
-         exchange.bindQueue("queue1", "queue1", null, false, true, ms, pm, 1000, 20, 20);      
+         exchange.bindQueue("queue1", "queue1", null, false, durableQueue, ms, pm, 1000, 20, 20);      
 
       MessageQueue queue1 = binding1.getQueue();
-      SimpleReceiver receiver1 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
+      SimpleReceiver receiver1 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);
       queue1.add(receiver1);
 
       assertTrue(binding1.isActive());
 
-      Message msg1 = MessageFactory.createCoreMessage(1);      
+      Message msg1 = MessageFactory.createCoreMessage(1, persistentMessage, null);      
       MessageReference ref1 = ms.reference(msg1);
       
-      Message msg2 = MessageFactory.createCoreMessage(2);      
+      Message msg2 = MessageFactory.createCoreMessage(2, persistentMessage, null);      
       MessageReference ref2 = ms.reference(msg2);
       
       Transaction tx = tr.createTransaction();
@@ -270,17 +254,17 @@
       
       receiver1.clear();
            
-      Message msg3 = MessageFactory.createCoreMessage(3);      
+      Message msg3 = MessageFactory.createCoreMessage(3, persistentMessage, null);      
       MessageReference ref3 = ms.reference(msg3);
       
-      Message msg4 = MessageFactory.createCoreMessage(4);      
+      Message msg4 = MessageFactory.createCoreMessage(4, persistentMessage, null);      
       MessageReference ref4 = ms.reference(msg4);
       
-      Transaction tx2 = tr.createTransaction();
+      tx = tr.createTransaction();
       
-      routed = exchange.route(ref3, "queue1", tx2);            
+      routed = exchange.route(ref3, "queue1", tx);            
       assertTrue(routed);
-      routed = exchange.route(ref4, "queue1", tx2);            
+      routed = exchange.route(ref4, "queue1", tx);            
       assertTrue(routed);
             
       msgs = queue1.browse();
@@ -296,10 +280,10 @@
       receiver1.clear();
       
       
-      Message msg5 = MessageFactory.createCoreMessage(5);      
+      Message msg5 = MessageFactory.createCoreMessage(5, persistentMessage, null);      
       MessageReference ref5 = ms.reference(msg5);
       
-      Message msg6 = MessageFactory.createCoreMessage(6);      
+      Message msg6 = MessageFactory.createCoreMessage(6, persistentMessage, null);      
       MessageReference ref6 = ms.reference(msg6);
             
       routed = exchange.route(ref5, "queue1", null);            
@@ -339,10 +323,10 @@
       
       receiver1.clear();
       
-      Message msg7 = MessageFactory.createCoreMessage(7);      
+      Message msg7 = MessageFactory.createCoreMessage(7, persistentMessage, null);      
       MessageReference ref7 = ms.reference(msg7);
       
-      Message msg8 = MessageFactory.createCoreMessage(8);      
+      Message msg8 = MessageFactory.createCoreMessage(8, persistentMessage, null);      
       MessageReference ref8 = ms.reference(msg8);
             
       routed = exchange.route(ref7, "queue1", null);            
@@ -385,8 +369,74 @@
 
    }
    
-
-   // Package protected ---------------------------------------------
+   protected void route(boolean persistentMessage, boolean durableQueue) throws Throwable
+   {
+      Exchange exchange = createExchange();
+      
+      Binding binding1 =
+         exchange.bindQueue("queue1", "queue1", null, false, durableQueue, ms, pm, 1000, 20, 20);      
+      Binding binding2 =
+         exchange.bindQueue("queue2", "queue2", null, false, durableQueue, ms, pm, 1000, 20, 20);
+      
+      MessageQueue queue1 = binding1.getQueue();      
+      MessageQueue queue2 = binding2.getQueue();
+      SimpleReceiver receiver1 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);
+      queue1.add(receiver1);
+      SimpleReceiver receiver2 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+      queue2.add(receiver2);
+      
+      assertTrue(binding1.isActive());      
+      assertTrue(binding2.isActive());
+      
+      Message msg1 = MessageFactory.createCoreMessage(1, persistentMessage, null);     
+      MessageReference ref1 = ms.reference(msg1);
+      
+      boolean routed = exchange.route(ref1, "queue1", null);      
+      assertTrue(routed);
+      
+      List msgs = receiver1.getMessages();
+      assertNotNull(msgs);
+      assertEquals(1, msgs.size());
+      Message msgRec = (Message)msgs.get(0);
+      assertTrue(msg1 == msgRec);
+      
+      if (msg1 == msgRec)
+      {
+         log.info("&&&&&&&&&&&&&& THEY ARE ONE AND THE SAME");
+      }
+      
+      receiver1.acknowledge(msgRec, null);
+      msgs = queue1.browse();
+      assertNotNull(msgs);
+      assertTrue(msgs.isEmpty());      
+      
+      msgs = receiver2.getMessages();
+      assertNotNull(msgs);
+      assertTrue(msgs.isEmpty());
+      
+      receiver1.clear();
+      receiver2.clear();
+      
+      Message msg2 = MessageFactory.createCoreMessage(2);      
+      MessageReference ref2 = ms.reference(msg2);
+      
+      routed = exchange.route(ref2, "queue2", null);      
+      assertTrue(routed);
+      
+      msgs = receiver2.getMessages();
+      assertNotNull(msgs);
+      assertEquals(1, msgs.size());
+      msgRec = (Message)msgs.get(0);
+      assertTrue(msg2 == msgRec);
+      receiver2.acknowledge(msgRec, null);
+      msgs = queue2.browse();
+      assertNotNull(msgs);
+      assertTrue(msgs.isEmpty());
+      
+      msgs = receiver1.getMessages();
+      assertNotNull(msgs);
+      assertTrue(msgs.isEmpty());
+   }
    
    protected Exchange createExchange() throws Exception
    {
@@ -399,8 +449,6 @@
       return exchange;
    }
 
-   // Protected -----------------------------------------------------
-
    // Private -------------------------------------------------------
 
    // Inner classes -------------------------------------------------

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -683,8 +683,8 @@
       //First load exactly 10
       PersistenceManager.InitialLoadInfo info = pm.getInitialReferenceInfos(channel.getChannelID(), 10);
       
-      assertEquals(-1, info.getMinPageOrdering());
-      assertEquals(-1, info.getMaxPageOrdering());
+      assertNull(info.getMinPageOrdering());
+      assertNull(info.getMaxPageOrdering());
       
       List refInfos = info.getRefInfos();
       
@@ -705,8 +705,8 @@
       //fullSize has increased to 15 - only 10 should be loadeed still
       info = pm.getInitialReferenceInfos(channel.getChannelID(), 15);
       
-      assertEquals(-1, info.getMinPageOrdering());
-      assertEquals(-1, info.getMaxPageOrdering());
+      assertNull(info.getMinPageOrdering());
+      assertNull(info.getMaxPageOrdering());
       
       refInfos = info.getRefInfos();
       assertNotNull(refInfos);
@@ -726,8 +726,8 @@
       //fullSize has gone down to 7 - 7 should be loaded and the other 3 marked as paged
       info = pm.getInitialReferenceInfos(channel.getChannelID(), 7);
       
-      assertEquals(0, info.getMinPageOrdering());
-      assertEquals(2, info.getMaxPageOrdering());
+      assertEquals(0, info.getMinPageOrdering().longValue());
+      assertEquals(2, info.getMaxPageOrdering().longValue());
       
       refInfos = info.getRefInfos();
       assertNotNull(refInfos);
@@ -752,8 +752,8 @@
       
       info = pm.getInitialReferenceInfos(channel.getChannelID(), 4);
       
-      assertEquals(0, info.getMinPageOrdering());
-      assertEquals(5, info.getMaxPageOrdering());
+      assertEquals(0, info.getMinPageOrdering().longValue());
+      assertEquals(5, info.getMaxPageOrdering().longValue());
       
       refInfos = info.getRefInfos();
       assertNotNull(refInfos);
@@ -778,8 +778,8 @@
       
       info = pm.getInitialReferenceInfos(channel.getChannelID(), 6);
       
-      assertEquals(2, info.getMinPageOrdering());
-      assertEquals(5, info.getMaxPageOrdering());
+      assertEquals(2, info.getMinPageOrdering().longValue());
+      assertEquals(5, info.getMaxPageOrdering().longValue());
       
       refInfos = info.getRefInfos();
       assertNotNull(refInfos);
@@ -811,8 +811,8 @@
       
       info = pm.getInitialReferenceInfos(channel.getChannelID(), 12);
       
-      assertEquals(-1, info.getMinPageOrdering());
-      assertEquals(-1, info.getMaxPageOrdering());
+      assertNull(info.getMinPageOrdering());
+      assertNull(info.getMaxPageOrdering());
       
       refInfos = info.getRefInfos();
       assertNotNull(refInfos);
@@ -827,7 +827,7 @@
       assertEquals(ref7.getMessageID(), ((PersistenceManager.ReferenceInfo)refInfos.get(6)).getMessageId());
       assertEquals(ref8.getMessageID(), ((PersistenceManager.ReferenceInfo)refInfos.get(7)).getMessageId());
       assertEquals(ref9.getMessageID(), ((PersistenceManager.ReferenceInfo)refInfos.get(8)).getMessageId());
-      assertEquals(ref10.getMessageID(), ((PersistenceManager.ReferenceInfo)refInfos.get(9)).getMessageId());                              
+      assertEquals(ref10.getMessageID(), ((PersistenceManager.ReferenceInfo)refInfos.get(9)).getMessageId());            
    }
       
    

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/JGroupsUtil.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/JGroupsUtil.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/JGroupsUtil.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -38,7 +38,7 @@
 
    
    public static String getDataStackProperties(int PING_timeout,
-                                                       int PING_num_initial_members)
+                                               int PING_num_initial_members)
    {
       String host = System.getProperty("test.bind.address");
       if (host == null)

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/TopicExchangeTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/TopicExchangeTest.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/TopicExchangeTest.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -72,559 +72,631 @@
       super.tearDown();
    }
    
-   public final void testRoute() throws Throwable
+   public final void testRoutePersistent() throws Throwable
    {
-      Exchange exchange = createExchange();
-      
-      Binding binding1 =
-         exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
-      Binding binding2 =
-         exchange.bindQueue("sub2", "topic1", null, false, false, ms, pm, 1000, 20, 20);
-      Binding binding3 =
-         exchange.bindQueue("sub3", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
-      Binding binding4 =
-         exchange.bindQueue("sub4", "topic2", null, false, true, ms, pm, 1000, 20, 20);
-      Binding binding5 =
-         exchange.bindQueue("sub5", "topic2", null, false, true, ms, pm, 1000, 20, 20);      
-      Binding binding6 =
-         exchange.bindQueue("sub6", "topic2", null, false, true, ms, pm, 1000, 20, 20);
-      
-      MessageQueue queue1 = binding1.getQueue();      
-      MessageQueue queue2 = binding2.getQueue();
-      MessageQueue queue3 = binding3.getQueue();      
-      MessageQueue queue4 = binding4.getQueue();
-      MessageQueue queue5 = binding5.getQueue();      
-      MessageQueue queue6 = binding6.getQueue();
-      SimpleReceiver receiver1 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue1.add(receiver1);
-      SimpleReceiver receiver2 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue2.add(receiver2);
-      SimpleReceiver receiver3 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue3.add(receiver3);
-      SimpleReceiver receiver4 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue4.add(receiver4);
-      SimpleReceiver receiver5 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue5.add(receiver5);
-      SimpleReceiver receiver6 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue6.add(receiver6);
-      
-      assertTrue(binding1.isActive());      
-      assertTrue(binding2.isActive());
-      assertTrue(binding3.isActive());      
-      assertTrue(binding4.isActive());
-      assertTrue(binding5.isActive());      
-      assertTrue(binding6.isActive());
-      
-      Message msg1 = MessageFactory.createCoreMessage(1);      
-      MessageReference ref1 = ms.reference(msg1);
-      
-      boolean routed = exchange.route(ref1, "topic1", null);      
-      assertTrue(routed);
-      
-      List msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      Message msgRec = (Message)msgs.get(0);
-      assertTrue(msg1 == msgRec);
-      receiver1.acknowledge(msgRec, null);
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      msgRec = (Message)msgs.get(0);
-      assertTrue(msg1 == msgRec);
-      receiver2.acknowledge(msgRec, null);
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver3.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      msgRec = (Message)msgs.get(0);
-      assertTrue(msg1 == msgRec);
-      receiver3.acknowledge(msgRec, null);
-      msgs = queue3.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver4.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver5.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver6.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      receiver1.clear();
-      receiver2.clear();
-      receiver3.clear();
-      
-      
-      Message msg2 = MessageFactory.createCoreMessage(2);      
-      MessageReference ref2 = ms.reference(msg2);
-      
-      routed = exchange.route(ref2, "topic2", null);      
-      assertTrue(routed);
-      
-      msgs = receiver4.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      msgRec = (Message)msgs.get(0);
-      assertTrue(msg2 == msgRec);
-      receiver4.acknowledge(msgRec, null);
-      msgs = queue4.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver5.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      msgRec = (Message)msgs.get(0);
-      assertTrue(msg2 == msgRec);
-      receiver5.acknowledge(msgRec, null);
-      msgs = queue5.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver6.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      msgRec = (Message)msgs.get(0);
-      assertTrue(msg2 == msgRec);
-      receiver6.acknowledge(msgRec, null);
-      msgs = queue6.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());    
-      
-      msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver3.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
+      route(true);
    }
    
+   public final void testRouteNonPersistent() throws Throwable
+   {
+      route(false);
+   }
+   
+   public final void testRouteTransactionalPersistent() throws Throwable
+   {
+      routeTransactional(true);
+   }
+   
+   public final void testRouteTransactionalNonPersistent() throws Throwable
+   {
+      routeTransactional(false);
+   }
+   
+      
    public final void testRouteInactive() throws Throwable
    {
-      Exchange exchange = createExchange();
+      Exchange exchange = null;
       
-      Binding binding1 =
-         exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
-      Binding binding2 =
-         exchange.bindQueue("sub2", "topic1", null, false, false, ms, pm, 1000, 20, 20);
-      Binding binding3 =
-         exchange.bindQueue("sub3", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
-      Binding binding4 =
-         exchange.bindQueue("sub4", "topic2", null, false, true, ms, pm, 1000, 20, 20);
-      Binding binding5 =
-         exchange.bindQueue("sub5", "topic2", null, false, true, ms, pm, 1000, 20, 20);      
-      Binding binding6 =
-         exchange.bindQueue("sub6", "topic2", null, false, true, ms, pm, 1000, 20, 20);
+      try
+      {
       
-      MessageQueue queue1 = binding1.getQueue();      
-      MessageQueue queue2 = binding2.getQueue();
-      MessageQueue queue3 = binding3.getQueue();      
-      MessageQueue queue4 = binding4.getQueue();
-      MessageQueue queue5 = binding5.getQueue();      
-      MessageQueue queue6 = binding6.getQueue();
-      SimpleReceiver receiver1 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue1.add(receiver1);
-      SimpleReceiver receiver2 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue2.add(receiver2);
-      SimpleReceiver receiver3 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue3.add(receiver3);
-      SimpleReceiver receiver4 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue4.add(receiver4);
-      SimpleReceiver receiver5 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue5.add(receiver5);
-      SimpleReceiver receiver6 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue6.add(receiver6);
-      
-      binding1.deactivate();
-      binding2.deactivate();
-      binding5.deactivate();
-      binding6.deactivate();
-      
-      assertFalse(binding1.isActive());      
-      assertFalse(binding2.isActive());
-      assertFalse(binding5.isActive());
-      assertFalse(binding6.isActive()); 
-      assertTrue(binding3.isActive());
-      assertTrue(binding4.isActive());      
-      
-      Message msg1 = MessageFactory.createCoreMessage(1);      
-      MessageReference ref1 = ms.reference(msg1);
-      
-      boolean routed = exchange.route(ref1, "topic1", null);      
-      assertTrue(routed);
-      
-      List msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver3.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      Message msgRec = (Message)msgs.get(0);
-      assertTrue(msg1 == msgRec);
-      receiver3.acknowledge(msgRec, null);
-      msgs = queue3.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());  
-      
-      msgs = receiver4.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver5.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver6.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      receiver3.clear();
-      
-      
-      
-      Message msg2 = MessageFactory.createCoreMessage(2);      
-      MessageReference ref2 = ms.reference(msg2);
-      
-      routed = exchange.route(ref2, "topic2", null);      
-      assertTrue(routed);
-      
-      msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver3.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());      
-      
-      msgs = receiver4.getMessages();
-      assertNotNull(msgs);
-      assertEquals(1, msgs.size());
-      msgRec = (Message)msgs.get(0);
-      assertTrue(msg1 == msgRec);
-      receiver4.acknowledge(msgRec, null);
-      msgs = queue4.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());  
-      
-      msgs = receiver5.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = receiver6.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
+         exchange = createExchange();
+         
+         Binding binding1 =
+            exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
+         Binding binding2 =
+            exchange.bindQueue("sub2", "topic1", null, false, false, ms, pm, 1000, 20, 20);
+         Binding binding3 =
+            exchange.bindQueue("sub3", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
+         Binding binding4 =
+            exchange.bindQueue("sub4", "topic2", null, false, true, ms, pm, 1000, 20, 20);
+         Binding binding5 =
+            exchange.bindQueue("sub5", "topic2", null, false, true, ms, pm, 1000, 20, 20);      
+         Binding binding6 =
+            exchange.bindQueue("sub6", "topic2", null, false, true, ms, pm, 1000, 20, 20);
+         
+         MessageQueue queue1 = binding1.getQueue();      
+         MessageQueue queue2 = binding2.getQueue();
+         MessageQueue queue3 = binding3.getQueue();      
+         MessageQueue queue4 = binding4.getQueue();
+         MessageQueue queue5 = binding5.getQueue();      
+         MessageQueue queue6 = binding6.getQueue();
+         SimpleReceiver receiver1 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue1.add(receiver1);
+         SimpleReceiver receiver2 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue2.add(receiver2);
+         SimpleReceiver receiver3 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue3.add(receiver3);
+         SimpleReceiver receiver4 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue4.add(receiver4);
+         SimpleReceiver receiver5 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue5.add(receiver5);
+         SimpleReceiver receiver6 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue6.add(receiver6);
+         
+         binding1.deactivate();
+         binding2.deactivate();
+         binding5.deactivate();
+         binding6.deactivate();
+         
+         assertFalse(binding1.isActive());      
+         assertFalse(binding2.isActive());
+         assertFalse(binding5.isActive());
+         assertFalse(binding6.isActive()); 
+         assertTrue(binding3.isActive());
+         assertTrue(binding4.isActive());      
+         
+         Message msg1 = MessageFactory.createCoreMessage(1);      
+         MessageReference ref1 = ms.reference(msg1);
+         
+         boolean routed = exchange.route(ref1, "topic1", null);      
+         assertTrue(routed);
+         
+         List msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver3.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         Message msgRec = (Message)msgs.get(0);
+         assertTrue(msg1 == msgRec);
+         receiver3.acknowledge(msgRec, null);
+         msgs = queue3.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());  
+         
+         msgs = receiver4.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver5.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver6.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         receiver3.clear();
+                     
+         Message msg2 = MessageFactory.createCoreMessage(2);      
+         MessageReference ref2 = ms.reference(msg2);
+         
+         routed = exchange.route(ref2, "topic2", null);      
+         assertTrue(routed);
+         
+         msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver3.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());      
+         
+         msgs = receiver4.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         msgRec = (Message)msgs.get(0);
+         assertTrue(msg2 == msgRec);
+         receiver4.acknowledge(msgRec, null);
+         msgs = queue4.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());  
+         
+         msgs = receiver5.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver6.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+      }
+      finally
+      {
+         if (exchange != null)
+         {
+            exchange.stop();
+         }
+      }
    
    }
 
    public final void testRouteNoBinding() throws Throwable
    {
-      Exchange exchange = createExchange();
+      Exchange exchange = null;
       
-      Binding binding1 =
-         exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
+      try
+      {      
+         exchange = createExchange();
+         
+         Binding binding1 =
+            exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
+   
+         MessageQueue queue1 = binding1.getQueue();
+         SimpleReceiver receiver1 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue1.add(receiver1);
+   
+         assertTrue(binding1.isActive());
+   
+         Message msg1 = MessageFactory.createCoreMessage(1);      
+         MessageReference ref1 = ms.reference(msg1);
+         
+         boolean routed = exchange.route(ref1, "this won't match anything", null);      
+         
+         //A topic exchange always returns true even if there is no binding
+         assertTrue(routed);
+               
+         List msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());             
+         
+      }
+      finally
+      {
+         if (exchange != null)
+         {
+            exchange.stop();
+         }
+      }
+   }
+   
+   
+   
+   // Package protected ---------------------------------------------
 
-      MessageQueue queue1 = binding1.getQueue();
-      SimpleReceiver receiver1 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue1.add(receiver1);
-
-      assertTrue(binding1.isActive());
-
-      Message msg1 = MessageFactory.createCoreMessage(1);      
-      MessageReference ref1 = ms.reference(msg1);
+   // Protected -----------------------------------------------------
+   
+   protected void route(boolean persistentMessage) throws Throwable
+   {
+      Exchange exchange = null;
       
-      boolean routed = exchange.route(ref1, "this won't match anything", null);      
+      try
+      {      
+         exchange = createExchange();
       
-      //A topic exchange always returns true even if there is no binding
-      assertTrue(routed);
-            
-      List msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());             
+         Binding binding1 =
+            exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
+         Binding binding2 =
+            exchange.bindQueue("sub2", "topic1", null, false, false, ms, pm, 1000, 20, 20);
+         Binding binding3 =
+            exchange.bindQueue("sub3", "topic1", null, false, false, ms, pm, 1000, 20, 20);      
+         Binding binding4 =
+            exchange.bindQueue("sub4", "topic2", null, false, true, ms, pm, 1000, 20, 20);
+         Binding binding5 =
+            exchange.bindQueue("sub5", "topic2", null, false, true, ms, pm, 1000, 20, 20);      
+         Binding binding6 =
+            exchange.bindQueue("sub6", "topic2", null, false, true, ms, pm, 1000, 20, 20);
+         
+         MessageQueue queue1 = binding1.getQueue();      
+         MessageQueue queue2 = binding2.getQueue();
+         MessageQueue queue3 = binding3.getQueue();      
+         MessageQueue queue4 = binding4.getQueue();
+         MessageQueue queue5 = binding5.getQueue();      
+         MessageQueue queue6 = binding6.getQueue();
+         SimpleReceiver receiver1 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue1.add(receiver1);
+         SimpleReceiver receiver2 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue2.add(receiver2);
+         SimpleReceiver receiver3 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue3.add(receiver3);
+         SimpleReceiver receiver4 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue4.add(receiver4);
+         SimpleReceiver receiver5 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue5.add(receiver5);
+         SimpleReceiver receiver6 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue6.add(receiver6);
+         
+         assertTrue(binding1.isActive());      
+         assertTrue(binding2.isActive());
+         assertTrue(binding3.isActive());      
+         assertTrue(binding4.isActive());
+         assertTrue(binding5.isActive());      
+         assertTrue(binding6.isActive());
+         
+         Message msg1 = MessageFactory.createCoreMessage(1, persistentMessage, null);      
+         MessageReference ref1 = ms.reference(msg1);
+         
+         boolean routed = exchange.route(ref1, "topic1", null);      
+         assertTrue(routed);
+         
+         List msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         Message msgRec = (Message)msgs.get(0);
+         assertTrue(msg1 == msgRec);
+         receiver1.acknowledge(msgRec, null);
+         msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         msgRec = (Message)msgs.get(0);
+         assertTrue(msg1 == msgRec);
+         receiver2.acknowledge(msgRec, null);
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver3.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         msgRec = (Message)msgs.get(0);
+         assertTrue(msg1 == msgRec);
+         receiver3.acknowledge(msgRec, null);
+         msgs = queue3.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver4.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver5.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver6.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         receiver1.clear();
+         receiver2.clear();
+         receiver3.clear();
+         
+         
+         Message msg2 = MessageFactory.createCoreMessage(2, persistentMessage, null);      
+         MessageReference ref2 = ms.reference(msg2);
+         
+         routed = exchange.route(ref2, "topic2", null);      
+         assertTrue(routed);
+         
+         msgs = receiver4.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         msgRec = (Message)msgs.get(0);
+         assertTrue(msg2 == msgRec);
+         receiver4.acknowledge(msgRec, null);
+         msgs = queue4.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver5.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         msgRec = (Message)msgs.get(0);
+         assertTrue(msg2 == msgRec);
+         receiver5.acknowledge(msgRec, null);
+         msgs = queue5.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver6.getMessages();
+         assertNotNull(msgs);
+         assertEquals(1, msgs.size());
+         msgRec = (Message)msgs.get(0);
+         assertTrue(msg2 == msgRec);
+         receiver6.acknowledge(msgRec, null);
+         msgs = queue6.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());    
+         
+         msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = receiver3.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+      }
+      finally
+      {
+         if (exchange != null)
+         {
+            exchange.stop();
+         }
+      }
    }
    
-   public final void testRouteTransactional() throws Throwable
+   protected void routeTransactional(boolean persistentMessage) throws Throwable
    {
-      Exchange exchange = createExchange();
+      Exchange exchange = null;
       
-      Binding binding1 =
-         exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);     
-      Binding binding2 =
-         exchange.bindQueue("sub2", "topic1", null, false, false, ms, pm, 1000, 20, 20);  
-
-      MessageQueue queue1 = binding1.getQueue();
-      SimpleReceiver receiver1 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue1.add(receiver1);
-      MessageQueue queue2 = binding2.getQueue();
-      SimpleReceiver receiver2 = new SimpleReceiver(SimpleReceiver.ACCEPTING);
-      queue2.add(receiver2);
-
-      assertTrue(binding1.isActive());
-      assertTrue(binding2.isActive());
-
-      Message msg1 = MessageFactory.createCoreMessage(1);      
-      MessageReference ref1 = ms.reference(msg1);
+      try
+      {      
+         exchange = createExchange();
       
-      Message msg2 = MessageFactory.createCoreMessage(2);      
-      MessageReference ref2 = ms.reference(msg2);
-      
-      Transaction tx = tr.createTransaction();
-      
-      boolean routed = exchange.route(ref1, "topic1", tx);            
-      assertTrue(routed);
-      routed = exchange.route(ref2, "topic1", tx);            
-      assertTrue(routed);
-            
-      List msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      tx.commit();
-      
-      msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      Message msgRec1 = (Message)msgs.get(0);
-      Message msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg1);
-      assertTrue(msgRec2 == msg2);
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg1);
-      assertTrue(msgRec2 == msg2);
-      
-      //Acknowledge non transactionally
-      receiver1.acknowledge(msgRec1, null);
-      receiver1.acknowledge(msgRec2, null);
-      
-      receiver2.acknowledge(msgRec1, null);
-      receiver2.acknowledge(msgRec2, null);
-
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty()); 
-      
-      receiver1.clear();
-      
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty()); 
-      
-      receiver2.clear();
-           
-      Message msg3 = MessageFactory.createCoreMessage(3);      
-      MessageReference ref3 = ms.reference(msg3);
-      
-      Message msg4 = MessageFactory.createCoreMessage(4);      
-      MessageReference ref4 = ms.reference(msg4);
-      
-      Transaction tx2 = tr.createTransaction();
-      
-      routed = exchange.route(ref3, "topic1", tx2);            
-      assertTrue(routed);
-      routed = exchange.route(ref4, "topic1", tx2);            
-      assertTrue(routed);
-            
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty()); 
-      
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty()); 
-      
-      tx.rollback();
-      
-      msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      receiver1.clear();
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-      
-      receiver2.clear();
-      
-      
-      Message msg5 = MessageFactory.createCoreMessage(5);      
-      MessageReference ref5 = ms.reference(msg5);
-      
-      Message msg6 = MessageFactory.createCoreMessage(6);      
-      MessageReference ref6 = ms.reference(msg6);
-            
-      routed = exchange.route(ref5, "topic1", null);            
-      assertTrue(routed);
-      routed = exchange.route(ref6, "topic1", null);            
-      assertTrue(routed);
-      
-      msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg5);
-      assertTrue(msgRec2 == msg6);
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg5);
-      assertTrue(msgRec2 == msg6);
-      
-      //Acknowledge transactionally
-      
-      tx = tr.createTransaction();
-      
-      receiver1.acknowledge(msgRec1, tx);
-      receiver1.acknowledge(msgRec2, tx);
-      
-      receiver2.acknowledge(msgRec1, tx);
-      receiver2.acknowledge(msgRec2, tx);
-      
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg5);
-      assertTrue(msgRec2 == msg6);
-      
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg5);
-      assertTrue(msgRec2 == msg6);
-      
-      tx.commit();
-      
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-            
-      receiver1.clear();
-      
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertTrue(msgs.isEmpty());
-            
-      receiver2.clear();
-      
-      Message msg7 = MessageFactory.createCoreMessage(7);      
-      MessageReference ref7 = ms.reference(msg7);
-      
-      Message msg8 = MessageFactory.createCoreMessage(8);      
-      MessageReference ref8 = ms.reference(msg8);
-            
-      routed = exchange.route(ref7, "topic1", null);            
-      assertTrue(routed);
-      routed = exchange.route(ref8, "topic1", null);            
-      assertTrue(routed);
-      
-      msgs = receiver1.getMessages();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg7);
-      assertTrue(msgRec2 == msg8);
-      
-      msgs = receiver2.getMessages();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg7);
-      assertTrue(msgRec2 == msg8);
-      
-      //Acknowledge transactionally
-      
-      tx = tr.createTransaction();
-      
-      receiver1.acknowledge(msgRec1, tx);
-      receiver1.acknowledge(msgRec2, tx);
-      
-      receiver2.acknowledge(msgRec1, tx);
-      receiver2.acknowledge(msgRec2, tx);
-      
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg7);
-      assertTrue(msgRec2 == msg8);
-      
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg7);
-      assertTrue(msgRec2 == msg8);
-      
-      tx.rollback();
-      
-      msgs = queue1.browse();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg7);
-      assertTrue(msgRec2 == msg8);
-      
-      msgs = queue2.browse();
-      assertNotNull(msgs);
-      assertEquals(2, msgs.size());
-      msgRec1 = (Message)msgs.get(0);
-      msgRec2 = (Message)msgs.get(1);
-      assertTrue(msgRec1 == msg7);
-      assertTrue(msgRec2 == msg8);
+         Binding binding1 =
+            exchange.bindQueue("sub1", "topic1", null, false, false, ms, pm, 1000, 20, 20);     
+         Binding binding2 =
+            exchange.bindQueue("sub2", "topic1", null, false, true, ms, pm, 1000, 20, 20);  
+   
+         MessageQueue queue1 = binding1.getQueue();
+         SimpleReceiver receiver1 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue1.add(receiver1);
+         MessageQueue queue2 = binding2.getQueue();
+         SimpleReceiver receiver2 = new SimpleReceiver("blah", SimpleReceiver.ACCEPTING);;
+         queue2.add(receiver2);
+   
+         assertTrue(binding1.isActive());
+         assertTrue(binding2.isActive());
+   
+         Message msg1 = MessageFactory.createCoreMessage(1, persistentMessage, null);      
+         MessageReference ref1 = ms.reference(msg1);
+         
+         Message msg2 = MessageFactory.createCoreMessage(2, persistentMessage, null);      
+         MessageReference ref2 = ms.reference(msg2);
+         
+         Transaction tx = tr.createTransaction();
+         
+         boolean routed = exchange.route(ref1, "topic1", tx);            
+         assertTrue(routed);
+         routed = exchange.route(ref2, "topic1", tx);            
+         assertTrue(routed);
+               
+         List msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         tx.commit();
+         
+         msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         Message msgRec1 = (Message)msgs.get(0);
+         Message msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg1);
+         assertTrue(msgRec2 == msg2);
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg1);
+         assertTrue(msgRec2 == msg2);
+         
+         //Acknowledge non transactionally
+         receiver1.acknowledge(msgRec1, null);
+         receiver1.acknowledge(msgRec2, null);
+         
+         receiver2.acknowledge(msgRec1, null);
+         receiver2.acknowledge(msgRec2, null);
+   
+         msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty()); 
+         
+         receiver1.clear();
+         
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty()); 
+         
+         receiver2.clear();
+              
+         Message msg3 = MessageFactory.createCoreMessage(3, persistentMessage, null);      
+         MessageReference ref3 = ms.reference(msg3);
+         
+         Message msg4 = MessageFactory.createCoreMessage(4, persistentMessage, null);      
+         MessageReference ref4 = ms.reference(msg4);
+         
+         tx = tr.createTransaction();
+         
+         routed = exchange.route(ref3, "topic1", tx);            
+         assertTrue(routed);
+         routed = exchange.route(ref4, "topic1", tx);            
+         assertTrue(routed);
+               
+         msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty()); 
+         
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty()); 
+         
+         tx.rollback();
+         
+         msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         receiver1.clear();
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+         
+         receiver2.clear();
+         
+         
+         Message msg5 = MessageFactory.createCoreMessage(5, persistentMessage, null);      
+         MessageReference ref5 = ms.reference(msg5);
+         
+         Message msg6 = MessageFactory.createCoreMessage(6, persistentMessage, null);      
+         MessageReference ref6 = ms.reference(msg6);
+               
+         routed = exchange.route(ref5, "topic1", null);            
+         assertTrue(routed);
+         routed = exchange.route(ref6, "topic1", null);            
+         assertTrue(routed);
+         
+         msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg5);
+         assertTrue(msgRec2 == msg6);
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg5);
+         assertTrue(msgRec2 == msg6);
+         
+         //Acknowledge transactionally
+         
+         tx = tr.createTransaction();
+         
+         receiver1.acknowledge(msgRec1, tx);
+         receiver1.acknowledge(msgRec2, tx);
+         
+         receiver2.acknowledge(msgRec1, tx);
+         receiver2.acknowledge(msgRec2, tx);
+         
+         msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg5);
+         assertTrue(msgRec2 == msg6);
+         
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg5);
+         assertTrue(msgRec2 == msg6);
+         
+         tx.commit();
+         
+         msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+               
+         receiver1.clear();
+         
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertTrue(msgs.isEmpty());
+               
+         receiver2.clear();
+         
+         Message msg7 = MessageFactory.createCoreMessage(7, persistentMessage, null);      
+         MessageReference ref7 = ms.reference(msg7);
+         
+         Message msg8 = MessageFactory.createCoreMessage(8, persistentMessage, null);      
+         MessageReference ref8 = ms.reference(msg8);
+               
+         routed = exchange.route(ref7, "topic1", null);            
+         assertTrue(routed);
+         routed = exchange.route(ref8, "topic1", null);            
+         assertTrue(routed);
+         
+         msgs = receiver1.getMessages();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg7);
+         assertTrue(msgRec2 == msg8);
+         
+         msgs = receiver2.getMessages();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg7);
+         assertTrue(msgRec2 == msg8);
+         
+         //Acknowledge transactionally
+         
+         tx = tr.createTransaction();
+         
+         receiver1.acknowledge(msgRec1, tx);
+         receiver1.acknowledge(msgRec2, tx);
+         
+         receiver2.acknowledge(msgRec1, tx);
+         receiver2.acknowledge(msgRec2, tx);
+         
+         msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg7);
+         assertTrue(msgRec2 == msg8);
+         
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg7);
+         assertTrue(msgRec2 == msg8);
+         
+         tx.rollback();
+         
+         msgs = queue1.browse();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg7);
+         assertTrue(msgRec2 == msg8);
+         
+         msgs = queue2.browse();
+         assertNotNull(msgs);
+         assertEquals(2, msgs.size());
+         msgRec1 = (Message)msgs.get(0);
+         msgRec2 = (Message)msgs.get(1);
+         assertTrue(msgRec1 == msg7);
+         assertTrue(msgRec2 == msg8);        
+      }
+      finally
+      {
+         if (exchange != null)
+         {
+            exchange.stop();
+         }
+      }
    }
    
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-   
    protected Exchange createExchange() throws Exception
    {
       TopicExchange exchange = new TopicExchange(sc.getDataSource(), sc.getTransactionManager());      

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/base/ExchangeTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/base/ExchangeTestBase.java	2006-09-01 21:40:31 UTC (rev 1251)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/base/ExchangeTestBase.java	2006-09-01 22:07:43 UTC (rev 1252)
@@ -120,262 +120,317 @@
    
    // Public --------------------------------------------------------
    
+   
    public final void testBind() throws Throwable
    {
-      Exchange exchange1 = createExchange();
+      Exchange exchange1 = null;
       
-      //Bind one durable
+      Exchange exchange2 = null;
       
-      Filter filter1 = new Selector("x = 'cheese'");
-      Filter filter2 = new Selector("y = 'bread'");
+      Exchange exchange3 = null;
       
-      Binding binding1 =
-         exchange1.bindQueue("durableQueue", "condition1", filter1, true, true, ms, pm, 2000, 100, 100);
-      
-      //Binding twice with the same name should fail      
       try
-      {
-         Binding bindFail = exchange1.bindQueue("durableQueue", "condition1", filter1, true, true, ms, pm, 2000, 100, 100);
-         fail();
+      {             
+         exchange1 = createExchange();
+         
+         //Bind one durable
+         
+         Filter filter1 = new Selector("x = 'cheese'");
+         Filter filter2 = new Selector("y = 'bread'");
+         
+         Binding binding1 =
+            exchange1.bindQueue("durableQueue", "condition1", filter1, true, true, ms, pm, 2000, 100, 100);
+         
+         //Binding twice with the same name should fail      
+         try
+         {
+            Binding bindFail = exchange1.bindQueue("durableQueue", "condition1", filter1, true, true, ms, pm, 2000, 100, 100);
+            fail();
+         }
+         catch (IllegalArgumentException e)
+         {
+            //Ok
+         }
+               
+         //Bind one non durable
+         Binding binding2 =
+            exchange1.bindQueue("nonDurableQueue", "condition2", filter2, true, false, ms, pm, 2000, 100, 100);
+         
+         //Check they're there
+         
+         Binding binding3 = exchange1.getBindingForName("durableQueue");
+         assertNotNull(binding3);
+         assertTrue(binding1 == binding3);
+         assertEquivalent(binding1, binding3);
+         assertNotNull(binding3.getQueue());
+         assertEquals(true, binding3.getQueue().isRecoverable());
+         
+         
+         Binding binding4 = exchange1.getBindingForName("nonDurableQueue");
+         assertNotNull(binding4);
+         assertTrue(binding2 == binding4);
+         assertEquivalent(binding2, binding4);
+         assertNotNull(binding4.getQueue());
+         assertEquals(false, binding4.getQueue().isRecoverable());
+         
+         exchange1.stop();
+         
+         //Throw away the exchange and create another
+         exchange2 = createExchange();
+         
+         //Only one binding should be there
+         Binding binding5 = exchange2.getBindingForName("durableQueue");
+         assertNotNull(binding5);
+         assertEquivalent(binding1, binding5);
+         //Should be unloaded
+         assertNull(binding5.getQueue());
+         
+         Binding binding6 = exchange2.getBindingForName("nonDurableQueue");
+         assertNull(binding6);
+         
+         //ReLoad the durable queue - or we won't be able to unbind it
+         exchange2.reloadQueues("condition1", ms, pm, 2000, 100, 100);
+         
+         //Unbind the binding
+         Binding binding7 = exchange2.unbindQueue("durableQueue");
+         assertNotNull(binding7);
+         assertEquivalent(binding1, binding7);
+         
+         //Make sure no longer there
+         Binding binding8 = exchange2.getBindingForName("durableQueue");
+         assertNull(binding8);
+         
+         exchange2.stop();
+         
+         //Throw away exchange and start another
+         exchange3 = createExchange();
+         
+         //Make sure not there
+         Binding binding9 = exchange3.getBindingForName("durableQueue");
+         assertNull(binding9);
+         
+         exchange3.stop();
       }
-      catch (Exception e)
+      finally
       {
-         //Ok
+         if (exchange1 != null)
+         {
+            exchange1.stop();
+         }
+         
+         if (exchange2 != null)
+         {
+            exchange2.stop();
+         }
+         
+         if (exchange3 != null)
+         {
+            exchange2.stop();
+         }
       }
             
-      //Bind one non durable
-      Binding binding2 =
-         exchange1.bindQueue("nonDurableQueue", "condition2", filter2, true, false, ms, pm, 2000, 100, 100);
-      
-      //Check they're there
-      
-      Binding binding3 = exchange1.getBindingForName("durableQueue");
-      assertNotNull(binding3);
-      assertTrue(binding1 == binding3);
-      assertEquivalent(binding1, binding3);
-      assertNotNull(binding3.getQueue());
-      assertEquals(true, binding3.getQueue().isRecoverable());
-      
-      
-      Binding binding4 = exchange1.getBindingForName("nonDurableQueue");
-      assertNotNull(binding4);
-      assertTrue(binding2 == binding4);
-      assertEquivalent(binding2, binding4);
-      assertNotNull(binding4.getQueue());
-      assertEquals(false, binding4.getQueue().isRecoverable());
-      
-      //Throw away the exchange and create another
-      Exchange exchange2 = createExchange();
-      
-      //Only one binding should be there
-      Binding binding5 = exchange2.getBindingForName("durableQueue");
-      assertNotNull(binding5);
-      assertEquivalent(binding1, binding5);
-      //Should be unloaded
-      assertNull(binding5.getQueue());
-      
-      Binding binding6 = exchange2.getBindingForName("nonDurableQueue");
-      assertNull(binding6);
-      
-      //ReLoad the durable queue - or we won't be able to unbind it
-      exchange2.reloadQueues("condition1", ms, pm, 2000, 100, 100);
-      
-      //Unbind the binding
-      Binding binding7 = exchange2.unbindQueue("durableQueue");
-      assertNotNull(binding7);
-      assertEquivalent(binding1, binding7);
-      
-      //Make sure no longer there
-      Binding binding8 = exchange2.getBindingForName("durableQueue");
-      assertNull(binding8);
-      
-      //Throw away exchange and start another
-      Exchange exchange3 = createExchange();
-      
-      //Make sure not there
-      Binding binding9 = exchange3.getBindingForName("durableQueue");
-      assertNull(binding9);
-            
    }
    
    public final void testListBindings() throws Throwable
    {
-      Exchange exchange = createExchange();
+      Exchange exchange = null;
       
-      Binding binding1 =
-         exchange.bindQueue("queue1", "condition1", null, true, false, ms, pm, 2000, 100, 100);
-      Binding binding2 =
-         exchange.bindQueue("queue2", "condition1", null, true, false, ms, pm, 2000, 100, 100);
-      Binding binding3 =
-         exchange.bindQueue("queue3", "condition1", null, true, false, ms, pm, 2000, 100, 100);
-      Binding binding4 =
-         exchange.bindQueue("queue4", "condition1", null, true, false, ms, pm, 2000, 100, 100);
-      Binding binding5 =
-         exchange.bindQueue("queue5", "condition2", null, true, false, ms, pm, 2000, 100, 100);
-      Binding binding6 =
-         exchange.bindQueue("queue6", "condition2", null, true, false, ms, pm, 2000, 100, 100);
-      Binding binding7 =
-         exchange.bindQueue("queue7", "condition2", null, true, false, ms, pm, 2000, 100, 100);
-      Binding binding8 =
-         exchange.bindQueue("queue8", "condition2", null, true, false, ms, pm, 2000, 100, 100);
-      
-      List bindings = exchange.listBindingsForWildcard("dummy");
-      assertNotNull(bindings);
-      assertTrue(bindings.isEmpty());
-      
-      //We don't match on substrings
-      bindings = exchange.listBindingsForWildcard("condition123");
-      assertNotNull(bindings);
-      assertTrue(bindings.isEmpty());
-      
-      //We don't currently support hierarchies
-      bindings = exchange.listBindingsForWildcard("condition1.subcondition");
-      assertNotNull(bindings);
-      assertTrue(bindings.isEmpty());
-      
-      //We currently just do an exact match
-      bindings = exchange.listBindingsForWildcard("condition1");
-      assertNotNull(bindings);
-      assertEquals(4, bindings.size());
-      
-      assertEquivalent((Binding)bindings.get(0), binding1);
-      assertEquivalent((Binding)bindings.get(1), binding2);
-      assertEquivalent((Binding)bindings.get(2), binding3);
-      assertEquivalent((Binding)bindings.get(3), binding4);
-      
-      bindings = exchange.listBindingsForWildcard("condition2");
-      assertNotNull(bindings);
-      assertEquals(4, bindings.size());
-      
-      assertEquivalent((Binding)bindings.get(0), binding5);
-      assertEquivalent((Binding)bindings.get(1), binding6);
-      assertEquivalent((Binding)bindings.get(2), binding7);
-      assertEquivalent((Binding)bindings.get(3), binding8);
+      try
+      {      
+         exchange = createExchange();
          
+         Binding binding1 =
+            exchange.bindQueue("queue1", "condition1", null, true, false, ms, pm, 2000, 100, 100);
+         Binding binding2 =
+            exchange.bindQueue("queue2", "condition1", null, true, false, ms, pm, 2000, 100, 100);
+         Binding binding3 =
+            exchange.bindQueue("queue3", "condition1", null, true, false, ms, pm, 2000, 100, 100);
+         Binding binding4 =
+            exchange.bindQueue("queue4", "condition1", null, true, false, ms, pm, 2000, 100, 100);
+         Binding binding5 =
+            exchange.bindQueue("queue5", "condition2", null, true, false, ms, pm, 2000, 100, 100);
+         Binding binding6 =
+            exchange.bindQueue("queue6", "condition2", null, true, false, ms, pm, 2000, 100, 100);
+         Binding binding7 =
+            exchange.bindQueue("queue7", "condition2", null, true, false, ms, pm, 2000, 100, 100);
+         Binding binding8 =
+            exchange.bindQueue("queue8", "condition2", null, true, false, ms, pm, 2000, 100, 100);
+         
+         List bindings = exchange.listBindingsForWildcard("dummy");
+         assertNotNull(bindings);
+         assertTrue(bindings.isEmpty());
+         
+         //We don't match on substrings
+         bindings = exchange.listBindingsForWildcard("condition123");
+         assertNotNull(bindings);
+         assertTrue(bindings.isEmpty());
+         
+         //We don't currently support hierarchies
+         bindings = exchange.listBindingsForWildcard("condition1.subcondition");
+         assertNotNull(bindings);
+         assertTrue(bindings.isEmpty());
+         
+         //We currently just do an exact match
+         bindings = exchange.listBindingsForWildcard("condition1");
+         assertNotNull(bindings);
+         assertEquals(4, bindings.size());
+         
+         assertEquivalent((Binding)bindings.get(0), binding1);
+         assertEquivalent((Binding)bindings.get(1), binding2);
+         assertEquivalent((Binding)bindings.get(2), binding3);
+         assertEquivalent((Binding)bindings.get(3), binding4);
+         
+         bindings = exchange.listBindingsForWildcard("condition2");
+         assertNotNull(bindings);
+         assertEquals(4, bindings.size());
+         
+         assertEquivalent((Binding)bindings.get(0), binding5);
+         assertEquivalent((Binding)bindings.get(1), binding6);
+         assertEquivalent((Binding)bindings.get(2), binding7);
+         assertEquivalent((Binding)bindings.get(3), binding8);
+      }
+      finally
+      {
+         if (exchange != null)
+         {
+            exchange.stop();
+         }
+      }
+         
    }
    
    public final void testUnloadReload() throws Exception
    {
-      Exchange exchange = createExchange();
+      Exchange exchange = null;
       
-      Binding binding1 =
-         exchange.bindQueue("reloadqueue1", "condition3", null, true, true, ms, pm, 2000, 100, 100);
-      Binding binding2 =
-         exchange.bindQueue("reloadqueue2", "condition3", null, true, true, ms, pm, 2000, 100, 100);
-      Binding binding3 =
-         exchange.bindQueue("reloadqueue3", "condition3", null, true, true, ms, pm, 2000, 100, 100);
-      Binding binding4 =
-         exchange.bindQueue("reloadqueue4", "condition3", null, true, true, ms, pm, 2000, 100, 100);
-      Binding binding5 =
-         exchange.bindQueue("reloadqueue5", "condition4", null, true, true, ms, pm, 2000, 100, 100);
-      Binding binding6 =
-         exchange.bindQueue("reloadqueue6", "condition4", null, true, true, ms, pm, 2000, 100, 100);
-      Binding binding7 =
-         exchange.bindQueue("reloadqueue7", "condition4", null, true, true, ms, pm, 2000, 100, 100);
-      Binding binding8 =
-         exchange.bindQueue("reloadqueue8", "condition4", null, true, true, ms, pm, 2000, 100, 100);
+      try
+      {
+         exchange = createExchange();      
       
-      assertNotNull(binding1.getQueue());
-      assertTrue(binding1.isActive());      
-      assertNotNull(binding2.getQueue());
-      assertTrue(binding2.isActive());
-      assertNotNull(binding3.getQueue());
-      assertTrue(binding3.isActive());
-      assertNotNull(binding4.getQueue());
-      assertTrue(binding4.isActive());
-      
-      assertNotNull(binding5.getQueue());
-      assertTrue(binding5.isActive());
-      assertNotNull(binding6.getQueue());
-      assertTrue(binding6.isActive());
-      assertNotNull(binding7.getQueue());
-      assertTrue(binding7.isActive());
-      assertNotNull(binding8.getQueue());
-      assertTrue(binding8.isActive());
-      
-      exchange.unloadQueues("condition3");
-      assertNull(binding1.getQueue());
-      assertFalse(binding1.isActive());      
-      assertNull(binding2.getQueue());
-      assertFalse(binding2.isActive());
-      assertNull(binding3.getQueue());
-      assertFalse(binding3.isActive());
-      assertNull(binding4.getQueue());
-      assertFalse(binding4.isActive());
-      
-      assertNotNull(binding5.getQueue());
-      assertTrue(binding5.isActive());
-      assertNotNull(binding6.getQueue());
-      assertTrue(binding6.isActive());
-      assertNotNull(binding7.getQueue());
-      assertTrue(binding7.isActive());
-      assertNotNull(binding8.getQueue());
-      assertTrue(binding8.isActive());
-      
-      exchange.unloadQueues("condition4");
-      assertNull(binding1.getQueue());
-      assertFalse(binding1.isActive());      
-      assertNull(binding2.getQueue());
-      assertFalse(binding2.isActive());
-      assertNull(binding3.getQueue());
-      assertFalse(binding3.isActive());
-      assertNull(binding4.getQueue());
-      assertFalse(binding4.isActive());
-      
-      assertNull(binding5.getQueue());
-      assertFalse(binding5.isActive());
-      assertNull(binding6.getQueue());
-      assertFalse(binding6.isActive());
-      assertNull(binding7.getQueue());
-      assertFalse(binding7.isActive());
-      assertNull(binding8.getQueue());
-      assertFalse(binding8.isActive());
-      
-      exchange.reloadQueues("condition3", ms, pm, 2000, 100, 100);
-      assertNotNull(binding1.getQueue());
-      assertTrue(binding1.isActive());      
-      assertNotNull(binding2.getQueue());
-      assertTrue(binding2.isActive());
-      assertNotNull(binding3.getQueue());
-      assertTrue(binding3.isActive());
-      assertNotNull(binding4.getQueue());
-      assertTrue(binding4.isActive());
-      
-      assertNull(binding5.getQueue());
-      assertFalse(binding5.isActive());
-      assertNull(binding6.getQueue());
-      assertFalse(binding6.isActive());
-      assertNull(binding7.getQueue());
-      assertFalse(binding7.isActive());
-      assertNull(binding8.getQueue());
-      assertFalse(binding8.isActive());
-      
-      exchange.reloadQueues("condition4", ms, pm, 2000, 100, 100);
-      
-      assertNotNull(binding1.getQueue());
-      assertTrue(binding1.isActive());      
-      assertNotNull(binding2.getQueue());
-      assertTrue(binding2.isActive());
-      assertNotNull(binding3.getQueue());
-      assertTrue(binding3.isActive());
-      assertNotNull(binding4.getQueue());
-      assertTrue(binding4.isActive());
-      
-      assertNotNull(binding5.getQueue());
-      assertTrue(binding5.isActive());
-      assertNotNull(binding6.getQueue());
-      assertTrue(binding6.isActive());
-      assertNotNull(binding7.getQueue());
-      assertTrue(binding7.isActive());
-      assertNotNull(binding8.getQueue());
-      assertTrue(binding8.isActive());
+         Binding binding1 =
+            exchange.bindQueue("reloadqueue1", "condition3", null, true, true, ms, pm, 2000, 100, 100);
+         Binding binding2 =
+            exchange.bindQueue("reloadqueue2", "condition3", null, true, true, ms, pm, 2000, 100, 100);
+         Binding binding3 =
+            exchange.bindQueue("reloadqueue3", "condition3", null, true, true, ms, pm, 2000, 100, 100);
+         Binding binding4 =
+            exchange.bindQueue("reloadqueue4", "condition3", null, true, true, ms, pm, 2000, 100, 100);
+         Binding binding5 =
+            exchange.bindQueue("reloadqueue5", "condition4", null, true, true, ms, pm, 2000, 100, 100);
+         Binding binding6 =
+            exchange.bindQueue("reloadqueue6", "condition4", null, true, true, ms, pm, 2000, 100, 100);
+         Binding binding7 =
+            exchange.bindQueue("reloadqueue7", "condition4", null, true, true, ms, pm, 2000, 100, 100);
+         Binding binding8 =
+            exchange.bindQueue("reloadqueue8", "condition4", null, true, true, ms, pm, 2000, 100, 100);
+         
+         assertNotNull(binding1.getQueue());
+         assertTrue(binding1.isActive());      
+         assertNotNull(binding2.getQueue());
+         assertTrue(binding2.isActive());
+         assertNotNull(binding3.getQueue());
+         assertTrue(binding3.isActive());
+         assertNotNull(binding4.getQueue());
+         assertTrue(binding4.isActive());
+         
+         assertNotNull(binding5.getQueue());
+         assertTrue(binding5.isActive());
+         assertNotNull(binding6.getQueue());
+         assertTrue(binding6.isActive());
+         assertNotNull(binding7.getQueue());
+         assertTrue(binding7.isActive());
+         assertNotNull(binding8.getQueue());
+         assertTrue(binding8.isActive());
+         
+         exchange.unloadQueues("condition3");
+         
+         assertNull(binding1.getQueue());
+         assertFalse(binding1.isActive());      
+         assertNull(binding2.getQueue());
+         assertFalse(binding2.isActive());
+         assertNull(binding3.getQueue());
+         assertFalse(binding3.isActive());
+         assertNull(binding4.getQueue());
+         assertFalse(binding4.isActive());
+         
+         assertNotNull(binding5.getQueue());
+         assertTrue(binding5.isActive());
+         assertNotNull(binding6.getQueue());
+         assertTrue(binding6.isActive());
+         assertNotNull(binding7.getQueue());
+         assertTrue(binding7.isActive());
+         assertNotNull(binding8.getQueue());
+         assertTrue(binding8.isActive());
+         
+         exchange.unloadQueues("condition4");
+         
+         assertNull(binding1.getQueue());
+         assertFalse(binding1.isActive());      
+         assertNull(binding2.getQueue());
+         assertFalse(binding2.isActive());
+         assertNull(binding3.getQueue());
+         assertFalse(binding3.isActive());
+         assertNull(binding4.getQueue());
+         assertFalse(binding4.isActive());
+         
+         assertNull(binding5.getQueue());
+         assertFalse(binding5.isActive());
+         assertNull(binding6.getQueue());
+         assertFalse(binding6.isActive());
+         assertNull(binding7.getQueue());
+         assertFalse(binding7.isActive());
+         assertNull(binding8.getQueue());
+         assertFalse(binding8.isActive());
+         
+         exchange.reloadQueues("condition3", ms, pm, 2000, 100, 100);
+           
+         assertNotNull(binding1.getQueue());
+         assertTrue(binding1.isActive());      
+         assertNotNull(binding2.getQueue());
+         assertTrue(binding2.isActive());
+         assertNotNull(binding3.getQueue());
+         assertTrue(binding3.isActive());
+         assertNotNull(binding4.getQueue());
+         assertTrue(binding4.isActive());
+         
+         assertNull(binding5.getQueue());
+         assertFalse(binding5.isActive());
+         assertNull(binding6.getQueue());
+         assertFalse(binding6.isActive());
+         assertNull(binding7.getQueue());
+         assertFalse(binding7.isActive());
+         assertNull(binding8.getQueue());
+         assertFalse(binding8.isActive());
+         
+         exchange.reloadQueues("condition4", ms, pm, 2000, 100, 100);
+   
+         assertNotNull(binding1.getQueue());
+         assertTrue(binding1.isActive());      
+         assertNotNull(binding2.getQueue());
+         assertTrue(binding2.isActive());
+         assertNotNull(binding3.getQueue());
+         assertTrue(binding3.isActive());
+         assertNotNull(binding4.getQueue());
+         assertTrue(binding4.isActive());
+         
+         assertNotNull(binding5.getQueue());
+         assertTrue(binding5.isActive());
+         assertNotNull(binding6.getQueue());
+         assertTrue(binding6.isActive());
+         assertNotNull(binding7.getQueue());
+         assertTrue(binding7.isActive());
+         assertNotNull(binding8.getQueue());
+         assertTrue(binding8.isActive());
+      }
+      finally
+      {
+         if (exchange != null)
+         {
+            exchange.stop();
+         }
+      }
    }
    
-   
-
-
-   
-   
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------
@@ -385,51 +440,14 @@
    protected void assertEquivalent(Binding binding1, Binding binding2)
    {
       assertEquals(binding1.getNodeId(), binding2.getNodeId());
-      assertEquals(binding1.getQueueName(), binding2.getQueueName());
+      log.info("b1:" + binding1.getQueueName() + " b2:" + binding2.getQueueName());
+      assertEquals(binding1.getQueueName(), binding2.getQueueName());      
       assertEquals(binding1.getSelector(), binding2.getSelector());
       assertEquals(binding1.getChannelId(), binding2.getChannelId());
       assertEquals(binding1.isDurable(), binding2.isDurable());
       assertEquals(binding1.isNoLocal(), binding2.isNoLocal());
    }
    
-//   protected void checkHasMessages(Message[] msgArray, MessageQueue queue, SimpleReceiver receiver)
-//   {
-//      List msgs = receiver.getMessages();
-//      
-//      assertNotNull(msgs);
-//      assertEquals(msgArray.length, msgs.size());
-//      for (int i = 0; i < msgArray.length; i++)
-//      {
-//         assertEquals(msgArray[i].getMessageID(), ((Message)msgs.get(i)).getMessageID());
-//      }
-//      
-//      msgs = queue.browse();
-//      assertNotNull(msgs);
-//      assertEquals(msgArray.length, msgs.size());
-//      for (int i = 0; i < msgArray.length; i++)
-//      {
-//         assertEquals(msgArray[i].getMessageID(), ((Message)msgs.get(i)).getMessageID());
-//      }
-//   }
-//   
-//   protected void ackMessages(Message[] msgArray, SimpleReceiver receiver, Transaction tx) throws Throwable
-//   {
-//      for (int i = 0; i < msgArray.length; i++)
-//      {
-//         receiver.acknowledge(msgArray[i], tx);
-//      }
-//   }
-//   
-//   protected void checkHasntMessages(MessageQueue queue, SimpleReceiver receiver)
-//   {
-//      List msgs = receiver.getMessages();      
-//      assertNotNull(msgs);
-//      assertTrue(msgs.isEmpty());
-//      
-//      msgs = queue.browse();
-//      assertNotNull(msgs);
-//      assertTrue(msgs.isEmpty());
-//   }
 
    // Private -------------------------------------------------------
 




More information about the jboss-cvs-commits mailing list