diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2006-11-20 16:43:14 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2006-11-20 16:43:14 +0000 |
commit | 3fe98a157ff2b46c9e27cc158ede0cf213badb9b (patch) | |
tree | d1f91726450e1fe1667fd073eb7814bff796aad0 /java/demo/Ice/async/QueueI.java | |
parent | Minor changes (diff) | |
download | ice-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.java | 60 |
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(); } |