diff options
| author | Ted Ross <tross@apache.org> | 2010-08-12 22:35:23 +0000 |
|---|---|---|
| committer | Ted Ross <tross@apache.org> | 2010-08-12 22:35:23 +0000 |
| commit | c99def7ea6c18522a51a64df9b24fa1195fd1aaa (patch) | |
| tree | b9546b74e7971d06a9dd73bf0164a59ec78f3eb8 /cpp/bindings/qmf2/examples/python | |
| parent | 9d87bd9a981bda0fe2106603030847588c3869fb (diff) | |
| download | qpid-python-c99def7ea6c18522a51a64df9b24fa1195fd1aaa.tar.gz | |
QPID-2793 - Python and Ruby bindings for the C++ QMFv2 API
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@985020 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/bindings/qmf2/examples/python')
| -rwxr-xr-x | cpp/bindings/qmf2/examples/python/agent.py | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/cpp/bindings/qmf2/examples/python/agent.py b/cpp/bindings/qmf2/examples/python/agent.py new file mode 100755 index 0000000000..c092c5ac30 --- /dev/null +++ b/cpp/bindings/qmf2/examples/python/agent.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python + +# +# 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. +# + +import cqpid +from qmf2 import * + + +class ExampleAgent(AgentHandler): + """ + This example agent is implemented as a single class that inherits AgentHandler. + It does not use a separate thread since once set up, it is driven strictly by + incoming method calls. + """ + + def __init__(self, url): + ## + ## Create and open a messaging connection to a broker. + ## + self.connection = cqpid.Connection(url) + self.connection.open() + + ## + ## Create, configure, and open a QMFv2 agent session using the connection. + ## + self.session = AgentSession(self.connection, "{interval:30}") + self.session.setVendor('profitron.com') + self.session.setProduct('blastinator') + self.session.setAttribute('attr1', 1000) + self.session.open() + + ## + ## Initialize the parent class. + ## + AgentHandler.__init__(self, self.session) + + + def shutdown(self): + """ + Clean up the session and connection. + """ + self.session.close() + self.connection.close() + + + def method(self, handle, methodName, args, subtypes, addr, userId): + """ + Handle incoming method calls. + """ + if addr == self.controlAddr: + self.control.methodCount += 1 + + if methodName == "stop": + self.session.methodSuccess(handle) + self.cancel() + + elif methodName == "echo": + handle.addReturnArgument("sequence", args["sequence"]) + handle.addReturnArgument("map", args["map"]) + self.session.methodSuccess(handle) + + elif methodName == "fail": + if args['useString']: + self.session.raiseException(handle, args['stringVal']) + else: + ex = Data(self.sch_exception) + ex.whatHappened = "It Failed" + ex.howBad = 75 + ex.details = args['details'] + self.session.raiseException(handle, ex) + + + def setupSchema(self): + """ + Create and register the schema for this agent. + """ + package = "com.profitron.bntor" + + ## + ## Declare a schema for a structure exception that can be used in failed + ## method invocations. + ## + self.sch_exception = Schema(SCHEMA_TYPE_DATA, package, "exception") + self.sch_exception.addProperty(SchemaProperty("whatHappened", SCHEMA_DATA_STRING)) + self.sch_exception.addProperty(SchemaProperty("howBad", SCHEMA_DATA_INT)) + self.sch_exception.addProperty(SchemaProperty("details", SCHEMA_DATA_MAP)) + + ## + ## Declare a control object to test methods against. + ## + self.sch_control = Schema(SCHEMA_TYPE_DATA, package, "control") + self.sch_control.addProperty(SchemaProperty("state", SCHEMA_DATA_STRING)) + self.sch_control.addProperty(SchemaProperty("methodCount", SCHEMA_DATA_INT)) + + stopMethod = SchemaMethod("stop", desc="Stop Agent") + stopMethod.addArgument(SchemaProperty("message", SCHEMA_DATA_STRING, direction=DIR_IN)) + self.sch_control.addMethod(stopMethod) + + echoMethod = SchemaMethod("echo", desc="Echo Arguments") + echoMethod.addArgument(SchemaProperty("sequence", SCHEMA_DATA_INT, direction=DIR_IN_OUT)) + echoMethod.addArgument(SchemaProperty("map", SCHEMA_DATA_MAP, direction=DIR_IN_OUT)) + self.sch_control.addMethod(echoMethod) + + failMethod = SchemaMethod("fail", desc="Expected to Fail") + failMethod.addArgument(SchemaProperty("useString", SCHEMA_DATA_BOOL, direction=DIR_IN)) + failMethod.addArgument(SchemaProperty("stringVal", SCHEMA_DATA_STRING, direction=DIR_IN)) + failMethod.addArgument(SchemaProperty("details", SCHEMA_DATA_MAP, direction=DIR_IN)) + self.sch_control.addMethod(failMethod) + + ## + ## Register our schemata with the agent session. + ## + self.session.registerSchema(self.sch_exception) + self.session.registerSchema(self.sch_control) + + + def populateData(self): + """ + Create a control object and give it to the agent session to manage. + """ + self.control = Data(self.sch_control) + self.control.state = "OPERATIONAL" + self.control.methodCount = 0 + self.controlAddr = self.session.addData(self.control, "singleton") + + + +agent = ExampleAgent("localhost") +agent.setupSchema() +agent.populateData() +agent.run() # Use agent.start() to launch the agent in a separate thread +agent.shutdown() + |
