summaryrefslogtreecommitdiff
path: root/cpp/demo/Ice/async/Consumer.cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2006-11-20 14:27:39 +0000
committerDwayne Boone <dwayne@zeroc.com>2006-11-20 14:27:39 +0000
commit6e75e27661055854623eee8671ce6d79ea2437f3 (patch)
tree7624f84223b8531453933e9362878d251753b0fd /cpp/demo/Ice/async/Consumer.cpp
parentMake.rules.cs will not check for Ice installation in /opt/Ice-major.minor (diff)
downloadice-6e75e27661055854623eee8671ce6d79ea2437f3.tar.bz2
ice-6e75e27661055854623eee8671ce6d79ea2437f3.tar.xz
ice-6e75e27661055854623eee8671ce6d79ea2437f3.zip
Added cancel operation
Diffstat (limited to 'cpp/demo/Ice/async/Consumer.cpp')
-rw-r--r--cpp/demo/Ice/async/Consumer.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/cpp/demo/Ice/async/Consumer.cpp b/cpp/demo/Ice/async/Consumer.cpp
index be16687b811..1b6f041a7c2 100644
--- a/cpp/demo/Ice/async/Consumer.cpp
+++ b/cpp/demo/Ice/async/Consumer.cpp
@@ -8,24 +8,44 @@
// **********************************************************************
#include <Ice/Application.h>
+#include <IceUtil/UUID.h>
#include <Queue.h>
using namespace std;
using namespace Demo;
+static IceUtil::StaticMutex requestsMutex = ICE_STATIC_MUTEX_INITIALIZER;
+static set<string> requests;
+
class AMI_Queue_getI : public AMI_Queue_get
{
public:
+ AMI_Queue_getI(const string& id)
+ : _id(id)
+ {
+ IceUtil::StaticMutex::Lock lock(requestsMutex);
+ requests.insert(_id);
+ }
virtual void ice_response(const string& message)
{
+ IceUtil::StaticMutex::Lock lock(requestsMutex);
+ requests.erase(_id);
+
cout << message << endl;
}
virtual void ice_exception(const ::Ice::Exception& ex)
{
+ IceUtil::StaticMutex::Lock lock(requestsMutex);
+ requests.erase(_id);
+
cout << ex << endl;
}
+
+private:
+
+ string _id;
};
class QueueConsumer : public Ice::Application
@@ -76,7 +96,8 @@ QueueConsumer::run(int argc, char* argv[])
cin >> c;
if(c == 'g')
{
- queue->get_async(new AMI_Queue_getI);
+ string id = IceUtil::generateUUID();
+ queue->get_async(new AMI_Queue_getI(id), id);
}
else if(c == 'x')
{
@@ -99,6 +120,28 @@ QueueConsumer::run(int argc, char* argv[])
}
while(cin.good() && c != 'x');
+
+ //
+ // Cancel any outstanding requests.
+ //
+ IceUtil::StaticMutex::Lock lock(requestsMutex);
+ if(requests.size() != 0)
+ {
+ try
+ {
+ vector<string> ids(requests.size());
+ for(set<string>::iterator p = requests.begin(); p != requests.end(); ++p)
+ {
+ ids.push_back(*p);
+ }
+ queue->cancel(ids);
+ }
+ catch(const Ice::Exception&)
+ {
+ // Ignore
+ }
+ }
+
return EXIT_SUCCESS;
}