diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRALogger.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRALogger.java
index 7853f09..f97ed9d 100644
--- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRALogger.java
+++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRALogger.java
@@ -49,7 +49,7 @@ public interface ActiveMQRALogger extends BasicLogger {
     */
    ActiveMQRALogger LOGGER = Logger.getMessageLogger(ActiveMQRALogger.class, ActiveMQRALogger.class.getPackage().getName());
 
-   @LogMessage(level = Logger.Level.INFO)
+   @LogMessage(level = Logger.Level.WARN)
    @Message(id = 151000, value = "awaiting topic/queue creation {0}", format = Message.Format.MESSAGE_FORMAT)
    void awaitingTopicQueueCreation(String destination);
 
diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/inflow/ActiveMQActivation.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/inflow/ActiveMQActivation.java
index f81aa09..9b1ded0 100644
--- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/inflow/ActiveMQActivation.java
+++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/inflow/ActiveMQActivation.java
@@ -124,6 +124,7 @@ public class ActiveMQActivation {
    private final AtomicBoolean inReconnect = new AtomicBoolean(false);
    private XARecoveryConfig resourceRecovery;
 
+   private final AtomicBoolean setupComplete = new AtomicBoolean(false);
    static {
       try {
          ONMESSAGE = MessageListener.class.getMethod("onMessage", new Class[]{Message.class});
@@ -300,7 +301,9 @@ public class ActiveMQActivation {
     */
    protected synchronized void setup() throws Exception {
       ActiveMQRALogger.LOGGER.debug("Setting up " + spec);
-
+      if(setupComplete.get()){
+          return;
+      }
       setupCF();
 
       setupDestination();
@@ -351,6 +354,7 @@ public class ActiveMQActivation {
          factory.getServerLocator().addClusterTopologyListener(new RebalancingListener());
       }
 
+      setupComplete.set(true);
       ActiveMQRALogger.LOGGER.debug("Setup complete " + this);
    }
 
@@ -360,95 +364,102 @@ public class ActiveMQActivation {
    protected synchronized void teardown() {
       ActiveMQRALogger.LOGGER.debug("Tearing down " + spec);
 
-      if (resourceRecovery != null) {
-         ra.getRecoveryManager().unRegister(resourceRecovery);
-      }
-
-      final ActiveMQMessageHandler[] handlersCopy = new ActiveMQMessageHandler[handlers.size()];
-
-      // We need to do from last to first as any temporary queue will have been created on the first handler
-      // So we invert the handlers here
-      for (int i = 0; i < handlers.size(); i++) {
-         // The index here is the complimentary so it's inverting the array
-         handlersCopy[i] = handlers.get(handlers.size() - i - 1);
-      }
-
-      handlers.clear();
-
-      FutureLatch future = new FutureLatch(handlersCopy.length);
-      List<Thread> interruptThreads = new ArrayList<>();
-      for (ActiveMQMessageHandler handler : handlersCopy) {
-         Thread thread = handler.interruptConsumer(future);
-         if (thread != null) {
-            interruptThreads.add(thread);
-         }
-      }
-
-      //wait for all the consumers to complete any onmessage calls
-      boolean stuckThreads = !future.await(factory.getCallTimeout());
-      //if any are stuck then we need to interrupt them
-      if (stuckThreads) {
-         for (Thread interruptThread : interruptThreads) {
-            try {
-               interruptThread.interrupt();
-            }
-            catch (Exception e) {
-               //ok
-            }
-         }
-      }
-
-      Thread threadTearDown = new Thread("TearDown/ActiveMQActivation") {
-         public void run() {
-            for (ActiveMQMessageHandler handler : handlersCopy) {
-               handler.teardown();
-            }
-         }
-      };
-
-      // We will first start a new thread that will call tearDown on all the instances, trying to graciously shutdown everything.
-      // We will then use the call-timeout to determine a timeout.
-      // if that failed we will then close the connection factory, and interrupt the thread
-      threadTearDown.start();
-
-      try {
-         threadTearDown.join(factory.getCallTimeout());
-      }
-      catch (InterruptedException e) {
-         // nothing to be done on this context.. we will just keep going as we need to send an interrupt to threadTearDown and give up
-      }
-
-      if (factory != null) {
-         try {
-            // closing the factory will help making sure pending threads are closed
-            factory.close();
-         }
-         catch (Throwable e) {
-            ActiveMQRALogger.LOGGER.warn(e);
-         }
-
-         factory = null;
+      if(!setupComplete.get()){
+          return;
+      }
+      try{
+          if (resourceRecovery != null) {
+             ra.getRecoveryManager().unRegister(resourceRecovery);
+          }
+    
+          final ActiveMQMessageHandler[] handlersCopy = new ActiveMQMessageHandler[handlers.size()];
+    
+          // We need to do from last to first as any temporary queue will have been created on the first handler
+          // So we invert the handlers here
+          for (int i = 0; i < handlers.size(); i++) {
+             // The index here is the complimentary so it's inverting the array
+             handlersCopy[i] = handlers.get(handlers.size() - i - 1);
+          }
+    
+          handlers.clear();
+    
+          FutureLatch future = new FutureLatch(handlersCopy.length);
+          List<Thread> interruptThreads = new ArrayList<>();
+          for (ActiveMQMessageHandler handler : handlersCopy) {
+             Thread thread = handler.interruptConsumer(future);
+             if (thread != null) {
+                interruptThreads.add(thread);
+             }
+          }
+    
+          //wait for all the consumers to complete any onmessage calls
+          boolean stuckThreads = !future.await(factory.getCallTimeout());
+          //if any are stuck then we need to interrupt them
+          if (stuckThreads) {
+             for (Thread interruptThread : interruptThreads) {
+                try {
+                   interruptThread.interrupt();
+                }
+                catch (Exception e) {
+                   //ok
+                }
+             }
+          }
+    
+          Thread threadTearDown = new Thread("TearDown/ActiveMQActivation") {
+             public void run() {
+                for (ActiveMQMessageHandler handler : handlersCopy) {
+                   handler.teardown();
+                }
+             }
+          };
+    
+          // We will first start a new thread that will call tearDown on all the instances, trying to graciously shutdown everything.
+          // We will then use the call-timeout to determine a timeout.
+          // if that failed we will then close the connection factory, and interrupt the thread
+          threadTearDown.start();
+    
+          try {
+             threadTearDown.join(factory.getCallTimeout());
+          }
+          catch (InterruptedException e) {
+             // nothing to be done on this context.. we will just keep going as we need to send an interrupt to threadTearDown and give up
+          }
+    
+          if (factory != null) {
+             try {
+                // closing the factory will help making sure pending threads are closed
+                factory.close();
+             }
+             catch (Throwable e) {
+                ActiveMQRALogger.LOGGER.warn(e);
+             }
+    
+             factory = null;
+          }
+    
+          if (threadTearDown.isAlive()) {
+             threadTearDown.interrupt();
+    
+             try {
+                threadTearDown.join(5000);
+             }
+             catch (InterruptedException e) {
+                // nothing to be done here.. we are going down anyways
+             }
+    
+             if (threadTearDown.isAlive()) {
+                ActiveMQRALogger.LOGGER.threadCouldNotFinish(threadTearDown.toString());
+             }
+          }
+    
+          nodes.clear();
+          lastReceived = false;
+    
+          ActiveMQRALogger.LOGGER.debug("Tearing down complete " + this);
+      } finally {
+          setupComplete.set(false);
       }
-
-      if (threadTearDown.isAlive()) {
-         threadTearDown.interrupt();
-
-         try {
-            threadTearDown.join(5000);
-         }
-         catch (InterruptedException e) {
-            // nothing to be done here.. we are going down anyways
-         }
-
-         if (threadTearDown.isAlive()) {
-            ActiveMQRALogger.LOGGER.threadCouldNotFinish(threadTearDown.toString());
-         }
-      }
-
-      nodes.clear();
-      lastReceived = false;
-
-      ActiveMQRALogger.LOGGER.debug("Tearing down complete " + this);
    }
 
    protected void setupCF() throws Exception {
