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 2009/03/10 20:50:25 UTC
svn commit: r752229 - in /servicemix/smx4/nmr/trunk/nmr:
api/src/main/java/org/apache/servicemix/nmr/api/
core/src/main/java/org/apache/servicemix/nmr/core/
core/src/test/java/org/apache/servicemix/nmr/core/
Author: gertv
Date: Tue Mar 10 19:50:24 2009
New Revision: 752229
URL: http://svn.apache.org/viewvc?rev=752229&view=rev
Log:
SMX4NMR-118: Allow canceling an Exchange that has been sent synchronously and is waiting for a response
Modified:
servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/Exchange.java
servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ExchangeImpl.java
servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/ExchangeImplTest.java
Modified: servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/Exchange.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/Exchange.java?rev=752229&r1=752228&r2=752229&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/Exchange.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/Exchange.java Tue Mar 10 19:50:24 2009
@@ -322,6 +322,13 @@
* @return the string representation
*/
String display(boolean displayContent);
+
+ /**
+ * Cancels a pending synchronous exchange.
+ *
+ * The canceled exchange's status will be set to {@link Status#Error}
+ */
+ void cancel();
}
Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ExchangeImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ExchangeImpl.java?rev=752229&r1=752228&r2=752229&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ExchangeImpl.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ExchangeImpl.java Tue Mar 10 19:50:24 2009
@@ -474,5 +474,16 @@
}
return converter;
}
-
+
+ public void cancel() {
+ cancel(consumerLock);
+ cancel(providerLock);
+ }
+
+ private void cancel(Semaphore lock) {
+ if (lock != null) {
+ setStatus(Status.Error);
+ lock.release();
+ }
+ }
}
Modified: servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/ExchangeImplTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/ExchangeImplTest.java?rev=752229&r1=752228&r2=752229&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/ExchangeImplTest.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/ExchangeImplTest.java Tue Mar 10 19:50:24 2009
@@ -22,6 +22,10 @@
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.net.URLClassLoader;
import javax.xml.namespace.QName;
@@ -31,6 +35,8 @@
import org.apache.servicemix.nmr.api.Pattern;
import org.apache.servicemix.nmr.api.Status;
import org.apache.servicemix.nmr.api.Type;
+import org.apache.servicemix.nmr.api.internal.InternalExchange;
+
import junit.framework.TestCase;
@@ -204,6 +210,28 @@
assertNotNull(e.getFault());
}
+ public void testCancel() throws InterruptedException {
+ final InternalExchange e = new ExchangeImpl(Pattern.InOnly);
+ final CountDownLatch latch = new CountDownLatch(1);
+ Thread thread = new Thread() {
+ @Override
+ public void run() {
+ try {
+ e.getConsumerLock(true).acquire();
+ latch.countDown();
+ } catch (InterruptedException e) {
+ fail(e.getMessage());
+ }
+ }
+ };
+ thread.start();
+ //let's sleep for a moment to make sure the thread has acquired the lock
+ Thread.sleep(150);
+ e.cancel();
+ assertTrue("Exchange should have been cancelled", latch.await(1, TimeUnit.SECONDS));
+ assertEquals(Status.Error, e.getStatus());
+ }
+
public static Map<String, Object> createMap(String... data) {
Map<String, Object> props = new HashMap<String, Object>();
for (int i = 0; i < data.length / 2; i++) {
@@ -211,5 +239,4 @@
}
return props;
}
-
}