You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2011/09/14 16:51:49 UTC

svn commit: r1170661 - in /servicemix/components/trunk/shared-libraries/servicemix-common/src: main/java/org/apache/servicemix/common/AsyncBaseLifeCycle.java test/java/org/apache/servicemix/common/AsyncBaseLifeCycleTest.java

Author: gertv
Date: Wed Sep 14 14:51:48 2011
New Revision: 1170661

URL: http://svn.apache.org/viewvc?rev=1170661&view=rev
Log:
SMXCOMP-903: Fix AsyncBaseLifeCycle's prepareShutdown method

Modified:
    servicemix/components/trunk/shared-libraries/servicemix-common/src/main/java/org/apache/servicemix/common/AsyncBaseLifeCycle.java
    servicemix/components/trunk/shared-libraries/servicemix-common/src/test/java/org/apache/servicemix/common/AsyncBaseLifeCycleTest.java

Modified: servicemix/components/trunk/shared-libraries/servicemix-common/src/main/java/org/apache/servicemix/common/AsyncBaseLifeCycle.java
URL: http://svn.apache.org/viewvc/servicemix/components/trunk/shared-libraries/servicemix-common/src/main/java/org/apache/servicemix/common/AsyncBaseLifeCycle.java?rev=1170661&r1=1170660&r2=1170661&view=diff
==============================================================================
--- servicemix/components/trunk/shared-libraries/servicemix-common/src/main/java/org/apache/servicemix/common/AsyncBaseLifeCycle.java (original)
+++ servicemix/components/trunk/shared-libraries/servicemix-common/src/main/java/org/apache/servicemix/common/AsyncBaseLifeCycle.java Wed Sep 14 14:51:48 2011
@@ -696,14 +696,23 @@ public class AsyncBaseLifeCycle implemen
      */
     public void prepareShutdown(Endpoint endpoint, long timeout) throws InterruptedException {
         Set<String> exchanges = getKnownExchanges(endpoint);
+        long start = System.currentTimeMillis();
+        long interval = timeout / 3;         // if a timeout has been set, we'll check 3 times within the timeout period
+
         synchronized (exchanges) {
-            if (!exchanges.isEmpty()) {
+            while (!exchanges.isEmpty()) {
                 for (String id : exchanges) {
                     logger.debug("Waiting for exchange {} in {}", id, endpoint);
                 }
-                exchanges.wait(timeout);
-                logger.debug(String.format("Gave up waiting for %s exchanges in %s after %s ms",
-                        exchanges.size(), endpoint, timeout));
+                exchanges.wait(interval);
+
+                // if a timeout has been set, this would be a good time to check that
+                long delta = System.currentTimeMillis() - start;
+                if (timeout != 0 && delta >= timeout) {
+                    logger.debug(String.format("Gave up waiting for %s exchanges in %s after %s ms",
+                                               exchanges.size(), endpoint, delta));
+                    break;
+                }
             }
         }
     }

Modified: servicemix/components/trunk/shared-libraries/servicemix-common/src/test/java/org/apache/servicemix/common/AsyncBaseLifeCycleTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/trunk/shared-libraries/servicemix-common/src/test/java/org/apache/servicemix/common/AsyncBaseLifeCycleTest.java?rev=1170661&r1=1170660&r2=1170661&view=diff
==============================================================================
--- servicemix/components/trunk/shared-libraries/servicemix-common/src/test/java/org/apache/servicemix/common/AsyncBaseLifeCycleTest.java (original)
+++ servicemix/components/trunk/shared-libraries/servicemix-common/src/test/java/org/apache/servicemix/common/AsyncBaseLifeCycleTest.java Wed Sep 14 14:51:48 2011
@@ -57,11 +57,12 @@ public class AsyncBaseLifeCycleTest exte
     public void testPrepareShutdown() throws InterruptedException {
         final Endpoint endpoint = new MockEndpoint() ;
 
-        MockMessageExchange exchange = new MockMessageExchange();
-        exchange.setExchangeId(UUID.randomUUID().toString());
+        MockMessageExchange exchange1 = createMockExchange();
+        MockMessageExchange exchange2 = createMockExchange();
 
-        // adding a known exchange
-        lifecycle.handleExchange(endpoint, exchange, true);
+        // adding 2 known exchanges
+        lifecycle.handleExchange(endpoint, exchange1, true);
+        lifecycle.handleExchange(endpoint, exchange2, true);
 
         final CountDownLatch done = new CountDownLatch(1);
 
@@ -76,14 +77,25 @@ public class AsyncBaseLifeCycleTest exte
             }
         });
 
-        assertFalse("Should be waiting for prepareShutdown to complete",
+        assertFalse("Should be waiting for prepareShutdown to complete (2 exchanges pending)",
                     done.await(1, TimeUnit.SECONDS));
 
-        lifecycle.handleExchange(endpoint, exchange, false);
+        lifecycle.handleExchange(endpoint, exchange1, false);
+
+        assertFalse("Should be waiting for prepareShutdown to complete (1 exchange pending)",
+                    done.await(1, TimeUnit.SECONDS));
+
+        lifecycle.handleExchange(endpoint, exchange2, false);
 
         assertTrue("prepareShutdown is now done", done.await(100, TimeUnit.SECONDS));
     }
 
+    private MockMessageExchange createMockExchange() {
+        MockMessageExchange exchange = new MockMessageExchange();
+        exchange.setExchangeId(UUID.randomUUID().toString());
+        return exchange;
+    }
+
     public void testPrepareShutdownWithTimeout() throws InterruptedException, ExecutionException, TimeoutException {
         final Endpoint endpoint = new MockEndpoint() ;