summaryrefslogtreecommitdiff
path: root/cpp/examples/failover/resuming_receiver.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2008-11-04 13:59:44 +0000
committerGordon Sim <gsim@apache.org>2008-11-04 13:59:44 +0000
commitd273ece322f7abd39c7c62307abad0d89371f409 (patch)
tree747bc209e6625a0662a87a96a74a8bba1dd0265a /cpp/examples/failover/resuming_receiver.cpp
parent95a5154a508d0e64e888aa948b8e4cfe9c581fe9 (diff)
downloadqpid-python-d273ece322f7abd39c7c62307abad0d89371f409.tar.gz
Adding a couple of utilities (don't alter any existing functionality) that are useful in applications handling failover.
Added example of their use that I've been using in testing. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@711256 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/examples/failover/resuming_receiver.cpp')
-rw-r--r--cpp/examples/failover/resuming_receiver.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/cpp/examples/failover/resuming_receiver.cpp b/cpp/examples/failover/resuming_receiver.cpp
new file mode 100644
index 0000000000..6ac67d8edb
--- /dev/null
+++ b/cpp/examples/failover/resuming_receiver.cpp
@@ -0,0 +1,106 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include <qpid/client/FailoverManager.h>
+#include <qpid/client/Session.h>
+#include <qpid/client/Message.h>
+#include <qpid/client/SubscriptionManager.h>
+
+#include <iostream>
+#include <fstream>
+
+
+using namespace qpid;
+using namespace qpid::client;
+using namespace qpid::framing;
+
+using namespace std;
+
+
+class Listener : public MessageListener, public FailoverManager::Command
+{
+ public:
+ Listener();
+ void received(Message& message);
+ void execute(AsyncSession& session, bool isRetry);
+ private:
+ Subscription subscription;
+ uint count;
+ uint skipped;
+ uint lastSn;
+};
+
+Listener::Listener() : count(0), skipped(0), lastSn(0) {}
+
+void Listener::received(Message & message)
+{
+ if (message.getData() == "That's all, folks!") {
+ std::cout << "Shutting down listener for " << message.getDestination()
+ << std::endl;
+
+ std::cout << "Listener received " << count << " messages (" << skipped << " skipped)" << std::endl;
+ subscription.cancel();
+ } else {
+ uint sn = message.getHeaders().getAsInt("sn");
+ if (lastSn < sn) {
+ if (sn - lastSn > 1) {
+ std::cout << "Warning: gap in sequence between " << lastSn << " and " << sn << std::endl;
+ }
+ lastSn = sn;
+ ++count;
+ } else {
+ ++skipped;
+ }
+ }
+}
+
+void Listener::execute(AsyncSession& session, bool isRetry)
+{
+ if (isRetry) {
+ std::cout << "Resuming from " << count << std::endl;
+ }
+ SubscriptionManager subs(session);
+ subscription = subs.subscribe(*this, "message_queue");
+ subs.run();
+}
+
+int main(int argc, char ** argv)
+{
+ ConnectionSettings settings;
+ if (argc > 1) settings.host = argv[1];
+ if (argc > 2) settings.port = atoi(argv[2]);
+
+ FailoverManager connection(settings);
+ Listener listener;
+
+ try {
+ connection.execute(listener);
+ connection.close();
+ std::cout << "Completed without error." << std::endl;
+ return 0;
+ } catch(const std::exception& error) {
+ std::cout << "Failure: " << error.what() << std::endl;
+ }
+ return 1;
+}
+
+
+