summaryrefslogtreecommitdiff
path: root/java/demo/Ice/async/QueueI.java
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2006-11-20 16:43:14 +0000
committerDwayne Boone <dwayne@zeroc.com>2006-11-20 16:43:14 +0000
commit3fe98a157ff2b46c9e27cc158ede0cf213badb9b (patch)
treed1f91726450e1fe1667fd073eb7814bff796aad0 /java/demo/Ice/async/QueueI.java
parentMinor changes (diff)
downloadice-3fe98a157ff2b46c9e27cc158ede0cf213badb9b.tar.bz2
ice-3fe98a157ff2b46c9e27cc158ede0cf213badb9b.tar.xz
ice-3fe98a157ff2b46c9e27cc158ede0cf213badb9b.zip
Added cancel
Diffstat (limited to 'java/demo/Ice/async/QueueI.java')
-rw-r--r--java/demo/Ice/async/QueueI.java60
1 files changed, 55 insertions, 5 deletions
diff --git a/java/demo/Ice/async/QueueI.java b/java/demo/Ice/async/QueueI.java
index c6243869c4d..57216d2acbd 100644
--- a/java/demo/Ice/async/QueueI.java
+++ b/java/demo/Ice/async/QueueI.java
@@ -12,13 +12,18 @@ import Demo.*;
public class QueueI extends _QueueDisp
{
synchronized public void
- get_async(AMD_Queue_get getCB, Ice.Current current)
+ get_async(AMD_Queue_get cb, String id, Ice.Current current)
{
+ //
+ // If there is already a message in the message queue, send the
+ // response immediately. Otherwise add the callback to the
+ // request queue.
+ //
if(_messageQueue.size() != 0)
{
try
{
- getCB.ice_response((String)_messageQueue.getFirst());
+ cb.ice_response((String)_messageQueue.getFirst());
_messageQueue.removeFirst();
}
catch(Ice.LocalException ex)
@@ -28,19 +33,27 @@ public class QueueI extends _QueueDisp
}
else
{
- _requestQueue.add(getCB);
+ Request request = new Request();
+ request.id = id;
+ request.cb = cb;
+ _requestQueue.add(request);
}
}
synchronized public void
add(String message, Ice.Current current)
{
+ //
+ // If there is an outstanding request in the request queue,
+ // send a response. Otherwise add the message to the message
+ // queue.
+ //
if(_requestQueue.size() != 0)
{
try
{
- AMD_Queue_get cb = (AMD_Queue_get)_requestQueue.removeFirst();
- cb.ice_response(message);
+ Request request = (Request)_requestQueue.removeFirst();
+ request.cb.ice_response(message);
}
catch(Ice.LocalException ex)
{
@@ -53,6 +66,43 @@ public class QueueI extends _QueueDisp
}
}
+ synchronized public void
+ cancel_async(AMD_Queue_cancel cb, String[] ids, Ice.Current current)
+ {
+ //
+ // We send immediate response so that later call to ice_exception
+ // on queued requests will not cause deadlocks.
+ //
+ cb.ice_response();
+
+ for(int i = 0; i < ids.length; ++i)
+ {
+ java.util.Iterator p = _requestQueue.iterator();
+ while(p.hasNext())
+ {
+ Request request = (Request)p.next();
+ if(request.id.equals(ids[i]))
+ {
+ try
+ {
+ request.cb.ice_exception(new RequestCanceledException());
+ }
+ catch(Ice.LocalException ex)
+ {
+ // Ignore
+ }
+ p.remove();
+ }
+ }
+ }
+ }
+
+ class Request
+ {
+ String id;
+ AMD_Queue_get cb;
+ }
+
private java.util.LinkedList _messageQueue = new java.util.LinkedList();
private java.util.LinkedList _requestQueue = new java.util.LinkedList();
}