You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/04/13 10:52:50 UTC
svn commit: r528393 - in /mina/trunk/core/src:
main/java/org/apache/mina/filter/reqres/
test/java/org/apache/mina/filter/reqres/
Author: trustin
Date: Fri Apr 13 01:52:50 2007
New Revision: 528393
URL: http://svn.apache.org/viewvc?view=rev&rev=528393
Log:
* Added Request.awaitResponse methods to allow easy blocking operation
Modified:
mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java
mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java
mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java
mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/Request.java Fri Apr 13 01:52:50 2007
@@ -19,7 +19,10 @@
*/
package org.apache.mina.filter.reqres;
+import java.util.NoSuchElementException;
import java.util.TimerTask;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
@@ -28,10 +31,14 @@
* @version $Rev$, $Date$
*/
public class Request {
+ private static final Object END = new Object();
+
private final Object id;
private final Object message;
private final long timeoutMillis;
private volatile TimerTask timerTask;
+
+ private final BlockingQueue<Object> responses = new LinkedBlockingQueue<Object>();
public Request(Object id, Object message, long timeoutMillis) {
this(id, message, timeoutMillis, TimeUnit.MILLISECONDS);
@@ -70,6 +77,56 @@
public long getTimeoutMillis() {
return timeoutMillis;
+ }
+
+ public Response awaitResponse() throws RequestTimeoutException, InterruptedException {
+ return convertToResponse(responses.take());
+ }
+
+ public Response awaitResponse(long timeout, TimeUnit unit) throws RequestTimeoutException, InterruptedException {
+ return convertToResponse(responses.poll(timeout, unit));
+ }
+
+ private Response convertToResponse(Object o) {
+ if (o instanceof Response) {
+ return (Response) o;
+ }
+
+ if (o == null) {
+ return null;
+ }
+
+ if (o == END) {
+ throw new NoSuchElementException(
+ "All responses has been retrieved already.");
+ }
+
+ throw (RequestTimeoutException) o;
+ }
+
+ public Response awaitResponseUninterruptibly() throws RequestTimeoutException {
+ for (;;) {
+ try {
+ return awaitResponse();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+
+ void signal(Response response) {
+ signal0(response);
+ if (response.getType() != ResponseType.PARTIAL) {
+ signal0(END);
+ }
+ }
+
+ void signal(RequestTimeoutException e) {
+ signal0(e);
+ signal0(END);
+ }
+
+ private void signal0(Object answer) {
+ responses.offer(answer);
}
@Override
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java Fri Apr 13 01:52:50 2007
@@ -135,7 +135,9 @@
}
// And forward the event.
- nextFilter.messageReceived(session, new Response(request, message, type));
+ Response response = new Response(request, message, type);
+ request.signal(response);
+ nextFilter.messageReceived(session, response);
}
}
@@ -148,6 +150,12 @@
}
Request request = (Request) message;
+ if (request.getTimerTask() != null) {
+ nextFilter.exceptionCaught(
+ session,
+ new IllegalArgumentException("Request can not be reused."));
+ }
+
ConcurrentMap<Object, Request> requestStore = getRequestStore(session);
Object oldValue = requestStore.putIfAbsent(request.getId(), request);
if (oldValue != null) {
@@ -252,7 +260,9 @@
ConcurrentMap<Object, Request> requestStore = getRequestStore(session);
if (requestStore.remove(request.getId(), request)) {
// Throw the exception only when it's really timed out.
- filter.exceptionCaught(session, new RequestTimeoutException(request));
+ RequestTimeoutException e = new RequestTimeoutException(request);
+ request.signal(e);
+ filter.exceptionCaught(session, e);
}
}
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestTimeoutException.java Fri Apr 13 01:52:50 2007
@@ -19,15 +19,15 @@
*/
package org.apache.mina.filter.reqres;
-import java.io.IOException;
+import org.apache.mina.common.RuntimeIOException;
/**
- * An {@link IOException} which is thrown when a {@link Request} is timed out.
+ * An {@link RuntimeIOException} which is thrown when a {@link Request} is timed out.
*
* @author The Apache MINA Project (dev@mina.apache.org)
* @version $Rev$, $Date$,
*/
-public class RequestTimeoutException extends IOException {
+public class RequestTimeoutException extends RuntimeIOException {
private static final long serialVersionUID = 5546784978950631652L;
private final Request request;
Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java?view=diff&rev=528393&r1=528392&r2=528393
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/reqres/RequestResponseFilterTest.java Fri Apr 13 01:52:50 2007
@@ -20,6 +20,7 @@
package org.apache.mina.filter.reqres;
import java.net.SocketAddress;
+import java.util.NoSuchElementException;
import org.apache.mina.common.DefaultWriteRequest;
import org.apache.mina.common.IoFilterChain;
@@ -115,6 +116,18 @@
// Verify
nextFilterControl.verify();
+ Assert.assertEquals(res, req.awaitResponse());
+ assertNoSuchElementException(req);
+ }
+
+ private void assertNoSuchElementException(Request req) throws InterruptedException {
+ // Make sure if an exception is thrown if a user waits one more time.
+ try {
+ req.awaitResponse();
+ Assert.fail();
+ } catch (NoSuchElementException e) {
+ // OK
+ }
}
@Test
@@ -142,6 +155,9 @@
// Verify
nextFilterControl.verify();
+ Assert.assertEquals(res1, req.awaitResponse());
+ Assert.assertEquals(res2, req.awaitResponse());
+ assertNoSuchElementException(req);
}
@Test
@@ -166,6 +182,17 @@
// Verify
nextFilterControl.verify();
+ assertRequestTimeoutException(req);
+ assertNoSuchElementException(req);
+ }
+
+ private void assertRequestTimeoutException(Request req) throws InterruptedException {
+ try {
+ req.awaitResponse();
+ Assert.fail();
+ } catch (RequestTimeoutException e) {
+ // OK
+ }
}
@Test
@@ -194,6 +221,9 @@
// Verify
nextFilterControl.verify();
+ Assert.assertEquals(res1, req.awaitResponse());
+ assertRequestTimeoutException(req);
+ assertNoSuchElementException(req);
}
@Test
@@ -229,6 +259,8 @@
// Verify
nextFilterControl.verify();
+ assertRequestTimeoutException(req1);
+ assertRequestTimeoutException(req2);
}
private static class Message {