You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2009/01/16 21:09:39 UTC

svn commit: r735115 - in /qpid/trunk/qpid/cpp: examples/qmf-console/Makefile.am examples/qmf-console/printevents.cpp examples/qmf-console/queuestats.cpp src/qpid/console/SessionManager.cpp src/tests/ManagementTest.cpp

Author: tross
Date: Fri Jan 16 12:09:39 2009
New Revision: 735115

URL: http://svn.apache.org/viewvc?rev=735115&view=rev
Log:
QPID-1588 - Fixed bug in asynchronous API operations.
            Added a new example to demonstrate async ops.

Added:
    qpid/trunk/qpid/cpp/examples/qmf-console/queuestats.cpp
Modified:
    qpid/trunk/qpid/cpp/examples/qmf-console/Makefile.am
    qpid/trunk/qpid/cpp/examples/qmf-console/printevents.cpp
    qpid/trunk/qpid/cpp/src/qpid/console/SessionManager.cpp
    qpid/trunk/qpid/cpp/src/tests/ManagementTest.cpp

Modified: qpid/trunk/qpid/cpp/examples/qmf-console/Makefile.am
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/qmf-console/Makefile.am?rev=735115&r1=735114&r2=735115&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/qmf-console/Makefile.am (original)
+++ qpid/trunk/qpid/cpp/examples/qmf-console/Makefile.am Fri Jan 16 12:09:39 2009
@@ -22,7 +22,7 @@
 MAKELDFLAG = qmfconsole
 include $(top_srcdir)/examples/makedist.mk
 
-noinst_PROGRAMS=console printevents ping
+noinst_PROGRAMS=console printevents ping queuestats
 
 console_SOURCES=console.cpp
 console_LDADD=$(CONSOLE_LIB)
@@ -33,9 +33,13 @@
 ping_SOURCES=ping.cpp
 ping_LDADD=$(CONSOLE_LIB)
 
+queuestats_SOURCES=queuestats.cpp
+queuestats_LDADD=$(CONSOLE_LIB)
+
 examples_DATA= \
 	console.cpp \
 	printevents.cpp \
 	ping.cpp \
+	queuestats.cpp \
 	$(MAKEDIST)
 

Modified: qpid/trunk/qpid/cpp/examples/qmf-console/printevents.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/qmf-console/printevents.cpp?rev=735115&r1=735114&r2=735115&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/qmf-console/printevents.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/qmf-console/printevents.cpp Fri Jan 16 12:09:39 2009
@@ -37,7 +37,7 @@
     }
 
     void brokerDisconnected(const Broker& broker) {
-        cout << qpid::sys::now() << " NOTIC qpid-printevents:brokerDisonnected broker=" <<
+        cout << qpid::sys::now() << " NOTIC qpid-printevents:brokerDisconnected broker=" <<
             broker.getUrl() << endl;
     }
 

Added: qpid/trunk/qpid/cpp/examples/qmf-console/queuestats.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/qmf-console/queuestats.cpp?rev=735115&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/examples/qmf-console/queuestats.cpp (added)
+++ qpid/trunk/qpid/cpp/examples/qmf-console/queuestats.cpp Fri Jan 16 12:09:39 2009
@@ -0,0 +1,141 @@
+/*
+ *
+ * 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/console/ConsoleListener.h"
+#include "qpid/console/SessionManager.h"
+
+using namespace std;
+using namespace qpid::console;
+
+//
+// Declare a subclass of ConsoleListener to receive asynchronous data.
+//
+class Listener : public ConsoleListener {
+
+    //
+    // Declare a map from ObjectId to string to store queue names by their object IDs.
+    //
+    typedef map<ObjectId, string> QueueMap;
+    QueueMap queueMap;
+public:
+    ~Listener() {}
+
+    //
+    // Receive property updates from the agent.
+    //
+    void objectProps(Broker& /*broker*/, Object& object) {
+        string name = object.attrString("name");
+        ObjectId oid = object.getObjectId();
+        QueueMap::iterator iter = queueMap.find(oid);
+
+        if (iter == queueMap.end()) {
+            //
+            // Object is not in the map.  Learn it.
+            //
+            cout << "New Queue: " << name << endl;
+            queueMap[oid] = name;
+        }
+    }
+
+    //
+    // Receive statistic updates from the agent.
+    //
+    void objectStats(Broker& /*broker*/, Object& object) {
+        ObjectId oid = object.getObjectId();
+        QueueMap::iterator iter = queueMap.find(oid);
+        if (iter == queueMap.end())
+            //
+            // Object id is not in the map.  We are not interested in this update.
+            //
+            return;
+
+        cout << "Stats for: " << iter->second << endl;
+        cout << "    msgTotalEnqueues = " << object.attrUint64("msgTotalEnqueues") << endl;
+        cout << "    msgTotalDequeues = " << object.attrUint64("msgTotalDequeues") << endl;
+        cout << "    msgDepth         = " << object.attrUint("msgDepth") << endl;
+
+        if (object.isDeleted()) {
+            //
+            // Object was deleted and is in the map.  Remove it.
+            //
+            cout << "Queue Deleted: " << iter->second << endl;
+            queueMap.erase(oid);
+        }
+
+        //
+        // Note that the object-delete logic is done after processing statistics.
+        // This allows us to get the "final" statistics for a deleted object.  It also
+        // assures that very short-lived objects are accounted for (i.e. created, used,
+        // and destroyed all within a single reporting interval).
+        //
+    }
+};
+
+//==============================================================
+// Main program
+//==============================================================
+int main_int(int /*argc*/, char** /*argv*/)
+{
+    Listener listener;
+
+    //
+    // Tune the settings for this application:  We wish to receive objects but not events.
+    // By using "userBindings", we can restrict which objects we receive updates for.
+    //
+    SessionManager::Settings sessionSettings;
+    sessionSettings.rcvObjects = true;
+    sessionSettings.rcvEvents = false;
+    sessionSettings.rcvHeartbeats = false;
+    sessionSettings.userBindings = true;
+
+    SessionManager sm(&listener, sessionSettings);
+
+    //
+    // We want to receive updates only for the broker queue object.
+    //
+    sm.bindClass("org.apache.qpid.broker", "queue");
+
+    //
+    // Connect to the broker.
+    //
+    qpid::client::ConnectionSettings connSettings;
+    Broker* broker = sm.addBroker(connSettings);
+
+    //
+    // Sleep while the listener does all the work asynchronously.
+    //
+    for (;;) {
+        sleep(1);
+    }
+
+    sm.delBroker(broker);
+    return 0;
+}
+
+int main(int argc, char** argv)
+{
+    try {
+        return main_int(argc, argv);
+    } catch(std::exception& e) {
+        cout << "Top Level Exception: " << e.what() << endl;
+    }
+}
+

Modified: qpid/trunk/qpid/cpp/src/qpid/console/SessionManager.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/console/SessionManager.cpp?rev=735115&r1=735114&r2=735115&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/console/SessionManager.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/console/SessionManager.cpp Fri Jan 16 12:09:39 2009
@@ -437,8 +437,8 @@
         if (syncSequenceList.count(sequence) == 1) {
             if (!object.isDeleted())
                 getResult.push_back(object);
+            return;
         }
-        return;
     }
 
     if (listener) {

Modified: qpid/trunk/qpid/cpp/src/tests/ManagementTest.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/ManagementTest.cpp?rev=735115&r1=735114&r2=735115&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/ManagementTest.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/ManagementTest.cpp Fri Jan 16 12:09:39 2009
@@ -21,6 +21,7 @@
 
 #include "qpid/management/ManagementObject.h"
 #include "qpid/framing/Buffer.h"
+#include "qpid/console/ObjectId.h"
 #include "unit_test.h"
 
 QPID_AUTO_TEST_SUITE(ManagementTestSuite)
@@ -80,6 +81,32 @@
     BOOST_CHECK_EQUAL(out2.str(), "10-20-30-40-50");
 }
 
+QPID_AUTO_TEST_CASE(testConsoleObjectId) {
+    qpid::console::ObjectId oid1, oid2;
+
+    oid1.setValue(1, 2);
+    oid2.setValue(3, 4);
+
+    BOOST_CHECK(oid1 < oid2);
+    BOOST_CHECK(oid1 <= oid2);
+    BOOST_CHECK(oid2 > oid1);
+    BOOST_CHECK(oid2 >= oid1);
+    BOOST_CHECK(oid1 != oid2);
+    BOOST_CHECK(oid1 == oid1);
+
+    oid1.setValue(3, 6);
+    oid2.setValue(3, 4);
+
+    BOOST_CHECK(oid1 > oid2);
+    BOOST_CHECK(oid1 >= oid2);
+    BOOST_CHECK(oid2 < oid1);
+    BOOST_CHECK(oid2 <= oid1);
+    BOOST_CHECK(oid1 != oid2);
+
+    oid2.setValue(3, 6);
+    BOOST_CHECK(oid1 == oid2);
+}
+
 QPID_AUTO_TEST_SUITE_END()