diff options
| author | Ted Ross <tross@apache.org> | 2010-11-10 22:30:38 +0000 |
|---|---|---|
| committer | Ted Ross <tross@apache.org> | 2010-11-10 22:30:38 +0000 |
| commit | 565d6ce4f20a55e9c4355c9adc75ca328b4e0cc5 (patch) | |
| tree | ef45c11a4756b88e5995697e0b5c21e53cb7628c /qpid/cpp | |
| parent | bd14418733310121b6cdef34af8b3c0c2cd2bc7f (diff) | |
| download | qpid-python-565d6ce4f20a55e9c4355c9adc75ca328b4e0cc5.tar.gz | |
Fixed segfault when setting the agent filter on a closed session.
Fixed notification for the connected-broker agent.
Added an example console program in c++ to monitor the set of agents.
Fixed the Python agent example to more elegantly handle connection failure.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1033763 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp')
| -rw-r--r-- | qpid/cpp/bindings/qmf2/examples/cpp/Makefile.am | 7 | ||||
| -rw-r--r-- | qpid/cpp/bindings/qmf2/examples/cpp/list_agents.cpp | 67 | ||||
| -rwxr-xr-x | qpid/cpp/bindings/qmf2/examples/python/agent.py | 18 | ||||
| -rw-r--r-- | qpid/cpp/src/qmf/AgentSession.cpp | 2 | ||||
| -rw-r--r-- | qpid/cpp/src/qmf/ConsoleSession.cpp | 17 |
5 files changed, 102 insertions, 9 deletions
diff --git a/qpid/cpp/bindings/qmf2/examples/cpp/Makefile.am b/qpid/cpp/bindings/qmf2/examples/cpp/Makefile.am index 2244ddab3e..9c3bd615d6 100644 --- a/qpid/cpp/bindings/qmf2/examples/cpp/Makefile.am +++ b/qpid/cpp/bindings/qmf2/examples/cpp/Makefile.am @@ -21,6 +21,11 @@ INCLUDE = -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDE) -noinst_PROGRAMS=agent +noinst_PROGRAMS=agent list_agents + agent_SOURCES=agent.cpp agent_LDADD=$(top_builddir)/src/libqmf2.la + +list_agents_SOURCES=list_agents.cpp +list_agents_LDADD=$(top_builddir)/src/libqmf2.la + diff --git a/qpid/cpp/bindings/qmf2/examples/cpp/list_agents.cpp b/qpid/cpp/bindings/qmf2/examples/cpp/list_agents.cpp new file mode 100644 index 0000000000..f94ad9ed45 --- /dev/null +++ b/qpid/cpp/bindings/qmf2/examples/cpp/list_agents.cpp @@ -0,0 +1,67 @@ +/* + * 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/messaging/Connection.h> +#include <qpid/messaging/Duration.h> +#include <qmf/ConsoleSession.h> +#include <qmf/ConsoleEvent.h> +#include <qmf/Agent.h> +#include <qpid/types/Variant.h> +#include <string> +#include <iostream> + +using namespace std; +using namespace qmf; +using qpid::types::Variant; +using qpid::messaging::Duration; + +int main(int argc, char** argv) +{ + string url("localhost"); + string connectionOptions; + string sessionOptions; + + if (argc > 1) + url = argv[1]; + if (argc > 2) + connectionOptions = argv[2]; + if (argc > 3) + sessionOptions = argv[3]; + + qpid::messaging::Connection connection(url, connectionOptions); + connection.open(); + + ConsoleSession session(connection, sessionOptions); + session.open(); + + while (true) { + ConsoleEvent event; + if (session.nextEvent(event)) { + if (event.getType() == CONSOLE_AGENT_ADD) + cout << "Agent Added: " << event.getAgent().getName() << endl; + if (event.getType() == CONSOLE_AGENT_DEL) { + if (event.getAgentDelReason() == AGENT_DEL_AGED) + cout << "Agent Aged: " << event.getAgent().getName() << endl; + else + cout << "Agent Filtered: " << event.getAgent().getName() << endl; + } + } + } +} + diff --git a/qpid/cpp/bindings/qmf2/examples/python/agent.py b/qpid/cpp/bindings/qmf2/examples/python/agent.py index a915ed59b1..d354106042 100755 --- a/qpid/cpp/bindings/qmf2/examples/python/agent.py +++ b/qpid/cpp/bindings/qmf2/examples/python/agent.py @@ -35,12 +35,14 @@ class ExampleAgent(AgentHandler): ## Create and open a messaging connection to a broker. ## self.connection = cqpid.Connection(url) + self.session = None self.connection.open() ## ## Create, configure, and open a QMFv2 agent session using the connection. ## self.session = AgentSession(self.connection, "{interval:30}") + self.session.setDomain("test") self.session.setVendor('profitron.com') self.session.setProduct('blastinator') self.session.setAttribute('attr1', 1000) @@ -56,7 +58,8 @@ class ExampleAgent(AgentHandler): """ Clean up the session and connection. """ - self.session.close() + if self.session: + self.session.close() self.connection.close() @@ -141,10 +144,13 @@ class ExampleAgent(AgentHandler): self.controlAddr = self.session.addData(self.control, "singleton") +try: + agent = ExampleAgent("localhost") + agent.setupSchema() + agent.populateData() + agent.run() # Use agent.start() to launch the agent in a separate thread + agent.shutdown() +except Exception, e: + print "Exception Caught:", e -agent = ExampleAgent("localhost") -agent.setupSchema() -agent.populateData() -agent.run() # Use agent.start() to launch the agent in a separate thread -agent.shutdown() diff --git a/qpid/cpp/src/qmf/AgentSession.cpp b/qpid/cpp/src/qmf/AgentSession.cpp index 47e40ed24a..20beda4851 100644 --- a/qpid/cpp/src/qmf/AgentSession.cpp +++ b/qpid/cpp/src/qmf/AgentSession.cpp @@ -175,7 +175,7 @@ AgentSessionImpl::AgentSessionImpl(Connection& c, const string& options) : schemaUpdateTime(uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()))) { // - // Set Capability Level to 1 + // Set Agent Capability Level // attributes["qmf.agent_capability"] = AGENT_CAPABILITY_0_8; diff --git a/qpid/cpp/src/qmf/ConsoleSession.cpp b/qpid/cpp/src/qmf/ConsoleSession.cpp index 6eb9b94bf8..dc2bbe34ee 100644 --- a/qpid/cpp/src/qmf/ConsoleSession.cpp +++ b/qpid/cpp/src/qmf/ConsoleSession.cpp @@ -110,9 +110,17 @@ void ConsoleSessionImpl::setAgentFilter(const string& predicate) enqueueEventLH(eventImpl.release()); } - if (!connectedBrokerInAgentList && agentQuery.matchesPredicate(connectedBrokerAgent.getAttributes())) { + if (!connectedBrokerInAgentList && connectedBrokerAgent.isValid() && + agentQuery.matchesPredicate(connectedBrokerAgent.getAttributes())) { agents[connectedBrokerAgent.getName()] = connectedBrokerAgent; connectedBrokerInAgentList = true; + + // + // Enqueue a notification of the new agent. + // + auto_ptr<ConsoleEventImpl> eventImpl(new ConsoleEventImpl(CONSOLE_AGENT_ADD)); + eventImpl->setAgent(connectedBrokerAgent); + enqueueEventLH(ConsoleEvent(eventImpl.release())); } } @@ -393,6 +401,13 @@ void ConsoleSessionImpl::handleAgentUpdate(const string& agentName, const Varian if (!agentQuery || agentQuery.matchesPredicate(attrs)) { connectedBrokerInAgentList = true; agents[agentName] = agent; + + // + // Enqueue a notification of the new agent. + // + auto_ptr<ConsoleEventImpl> eventImpl(new ConsoleEventImpl(CONSOLE_AGENT_ADD)); + eventImpl->setAgent(agent); + enqueueEventLH(ConsoleEvent(eventImpl.release())); } return; } |
