You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@qpid.apache.org by Daryoush Mehrtash <dm...@gmail.com> on 2011/11/09 20:44:36 UTC

looking for QMF agent/console sample

I need to find out of if Qpid's QMF  would work for a simple RPC
application that I need to develop.     Any samples or tutorials showing
the agent requirements would be greatly appreciated.

Thanks
Daryoush

Re: looking for QMF agent/console sample

Posted by Carl Trieloff <cc...@redhat.com>.

nice, looking forward to the patch...

Carl.


On 11/10/2011 02:16 PM, Fraser Adams wrote:
> Hi chaps,
> for info I'm (finally!!) really close to finishing my Java
> implementation of the QMF2 API. It's pretty fully featured including
> Subscriptions on the Agent class (my test Agent is the mystical
> profitron too :-)) and also an emulation of Subscriptions on the
> console side for the C++ broker ManagementAgent (which doesn't support
> subscriptions) - that feature works by using the periodic broker
> ManagementAgent data indication and wrapping it to look like a
> Subscription.
>
> Anyway it's nearly finished bar some tarting up of the Javadoc and
> tidying up the tests and demos. I'm going to try and make a concerted
> push this weekend to finish it.
>
> One of the demos is a Java port of qpid-config that uses pure QMF2 to
> add/delete queues/bindings/exchanges, so with respect to QMF remote
> method invocation, as a taster, the QpidConfig addQueue method looks
> like this:
>
>
>    private void addQueue(String[] args)
>    {
>        if (args.length < 1)
>        {
>            usage();
>        }
>
>        Map properties = new HashMap();
>
>        for (String a : extraArguments)
>        {
>            String[] r = a.split("=");
>            String value = r.length == 2 ? r[1] : null;
>            properties.put(r[0], value);
>        }
>
>        if (_durable)
>        {
>            properties.put("durable", true);
>            properties.put(FILECOUNT, _fileCount);
>            properties.put(FILESIZE, _fileSize);
>        }
>
>        if (_maxQueueSize > 0)
>        {
>            properties.put(MAX_QUEUE_SIZE, _maxQueueSize);
>        }
>
>        if (_maxQueueCount > 0)
>        {
>            properties.put(MAX_QUEUE_COUNT, _maxQueueCount);
>        }
>
>        if (_limitPolicy.equals("reject"))
>        {
>            properties.put(POLICY_TYPE, "reject");
>        }
>        else if (_limitPolicy.equals("flow-to-disk"))
>        {
>            properties.put(POLICY_TYPE, "flow_to_disk");
>        }
>        else if (_limitPolicy.equals("ring"))
>        {
>            properties.put(POLICY_TYPE, "ring");
>        }
>        else if (_limitPolicy.equals("ring-strict"))
>        {
>            properties.put(POLICY_TYPE, "ring_strict");
>        }
>
>        if (_clusterDurable)
>        {
>            properties.put(CLUSTER_DURABLE, 1l);
>        }
>
>        if (_order.equals("lvq"))
>        {
>            properties.put(LVQ, 1l);
>        }
>        else if (_order.equals("lvq-no-browse"))
>        {
>            properties.put(LVQNB, 1l);
>        }
>
>        if (_eventGeneration > 0)
>        {
>            properties.put(QUEUE_EVENT_GENERATION, _eventGeneration);
>        }
>
>        if (_altExchange != null)
>        {
>            properties.put("alternate-exchange", _altExchange);
>        }
>
>        if (_flowStopSize > 0)
>        {
>            properties.put(FLOW_STOP_SIZE, _flowStopSize);
>        }
>
>        if (_flowResumeSize > 0)
>        {
>            properties.put(FLOW_RESUME_SIZE, _flowResumeSize);
>        }
>
>        if (_flowStopCount > 0)
>        {
>            properties.put(FLOW_STOP_COUNT, _flowStopCount);
>        }
>
>        if (_flowResumeCount > 0)
>        {
>            properties.put(FLOW_RESUME_COUNT, _flowResumeCount);
>        }
>
>        QmfData arguments = new QmfData();
>        arguments.setStringValue("type", "queue");
>        arguments.setStringValue("name", args[0]);
>        arguments.setValue("properties", properties);
>
>        try
>        {
>            _broker.invokeMethod("create", arguments);
>        }
>        catch (QmfException e)
>        {
>            System.out.println(e.getMessage());
>        }
>        // passive queue creation not implemented yet (not sure how to
> do it using QMF2)
>    }
>
>
>
>
> Ken Giusti wrote:
>> Yes - equivalent examples for a python agent and client can be found
>> in cpp/bindings/qmf2/examples/python directory.
>>
>> -K
>>
>>
>>
>>
>> ----- Original Message -----
>>  
>>> Would it be possible to write an agent in python also?
>>>
>>> Daryoush
>>>
>>>
>>> On Wed, Nov 9, 2011 at 2:01 PM, Ken Giusti <kg...@redhat.com>
>>> wrote:
>>>
>>>    
>>>> Hi Daryoush,
>>>>
>>>> There are some basic examples in
>>>> qpid/cpp/bindings/qmf2/examples/cpp/
>>>> directory.
>>>>
>>>> See:
>>>>
>>>> agent.cpp - an example agent that exposes some method calls (like
>>>> "echo").
>>>> list_agents.cpp - an example console that listens for agents
>>>> connecting to
>>>> a broker.
>>>>
>>>> Unfortunately, there are no examples of making method calls (!)
>>>>
>>>> I've hacked a quick example of calling the "echo" method exported
>>>> by
>>>> agent.cpp.  If you apply the patch below to list_agents.cpp
>>>> (trunk), it
>>>> will attempt to call the "echo" method.
>>>>
>>>> Fire off a broker (qpidd), start the agent.cpp executable (leave it
>>>> running), then run the modified list_agents.cpp.
>>>>
>>>> didn't test it very well, but it should give you an idea...
>>>>
>>>>
>>>> Index: list_agents.cpp
>>>> ===================================================================
>>>> --- list_agents.cpp     (revision 1199840)
>>>> +++ list_agents.cpp     (working copy)
>>>> @@ -21,6 +21,9 @@
>>>>  #include <qpid/messaging/Duration.h>
>>>>  #include <qmf/ConsoleSession.h>
>>>>  #include <qmf/ConsoleEvent.h>
>>>> +#include <qmf/Query.h>
>>>> +#include <qmf/Data.h>
>>>> +#include <qmf/DataAddr.h>
>>>>  #include <qmf/Agent.h>
>>>>  #include <qpid/types/Variant.h>
>>>>  #include <string>
>>>> @@ -60,6 +63,40 @@
>>>>                 if (event.getAgent().getName() ==
>>>> session.getConnectedBrokerAgent().getName())
>>>>                     extra = "  [Connected Broker]";
>>>>                 cout << "Agent Added: " <<
>>>>                 event.getAgent().getName() <<
>>>> extra << endl;
>>>> +                // find the "Profitron" agent
>>>> +                if (event.getAgent().getVendor() ==
>>>> "profitron.com") {
>>>> +                    Agent myAgent = event.getAgent();
>>>> +                    // query the agent for its schema
>>>> +                    ConsoleEvent schemaInfo =
>>>> event.getAgent().querySchema();
>>>> +                    // cout << "Schema Count: " <<
>>>> schemaInfo.getSchemaIdCount() << endl;
>>>> +                    // Find the Schema identifier for the
>>>> "control"
>>>> class...
>>>> +                    for (int i = 0; i <
>>>> schemaInfo.getSchemaIdCount();
>>>> ++i) {
>>>> +                        SchemaId sid = schemaInfo.getSchemaId(i);
>>>> +                        // cout << "SchemaId: " <<
>>>> sid.getPackageName()
>>>> << ":" << sid.getName() << ":" << sid.getHash() << endl;
>>>> +                        if (sid.getName() == "control") {
>>>> +                            // now query the agent for all the
>>>> "control"
>>>> objects - there is only one in this example
>>>> +                            Query q(QUERY_OBJECT_ID, sid);
>>>> +                            ConsoleEvent obj = myAgent.query(q);
>>>> +                            // cout << "Query returned=" <<
>>>> obj.getType()
>>>> << endl;
>>>> +                            // "control" is a singleton, so
>>>> getDataCount() returns 1 below
>>>> +                            for (int j = 0; j <
>>>> obj.getDataCount(); ++j) {
>>>> +                                // cout << "addr= " <<
>>>> obj.getData(j).getAddr().asMap() << endl;
>>>> +
>>>> +                                // get the address of the object,
>>>> so we
>>>> can call methods against it:
>>>> +                                DataAddr myObjId =
>>>> obj.getData(j).getAddr();
>>>> +                                // arguments to "echo" method
>>>> +                                Variant::Map args;
>>>> +                                Variant::Map map_data;
>>>> +                                map_data["hello"] =
>>>> Variant("world!");
>>>> +                                args["sequence"] = Variant(1);
>>>> +                                args["map"] = map_data;
>>>> +                                // invoke the method synchronously
>>>> +                                ConsoleEvent rc =
>>>> event.getAgent().callMethod("echo", args, myObjId);
>>>> +                                cout << "results=" <<
>>>> rc.getArguments()
>>>> << endl;
>>>> +                            }
>>>> +                        }
>>>> +                    }
>>>> +                }
>>>>             }
>>>>             if (event.getType() == CONSOLE_AGENT_DEL) {
>>>>                 if (event.getAgentDelReason() == AGENT_DEL_AGED)
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> ----- Original Message -----
>>>>      
>>>>> I need to find out of if Qpid's QMF  would work for a simple RPC
>>>>> application that I need to develop.     Any samples or tutorials
>>>>> showing
>>>>> the agent requirements would be greatly appreciated.
>>>>>
>>>>> Thanks
>>>>> Daryoush
>>>>>
>>>>>         
>>>> ---------------------------------------------------------------------
>>>> Apache Qpid - AMQP Messaging Implementation
>>>> Project:      http://qpid.apache.org
>>>> Use/Interact: mailto:users-subscribe@qpid.apache.org
>>>>
>>>>
>>>>       
>>> -- 
>>> Daryoush
>>>
>>> Weblog:  http://onfp.blogspot.com/
>>>
>>>     
>>
>> ---------------------------------------------------------------------
>> Apache Qpid - AMQP Messaging Implementation
>> Project:      http://qpid.apache.org
>> Use/Interact: mailto:users-subscribe@qpid.apache.org
>>
>>
>>   
>
>
> ---------------------------------------------------------------------
> Apache Qpid - AMQP Messaging Implementation
> Project:      http://qpid.apache.org
> Use/Interact: mailto:users-subscribe@qpid.apache.org
>


---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:users-subscribe@qpid.apache.org


Re: looking for QMF agent/console sample

Posted by Fraser Adams <fr...@blueyonder.co.uk>.
Hi chaps,
for info I'm (finally!!) really close to finishing my Java 
implementation of the QMF2 API. It's pretty fully featured including 
Subscriptions on the Agent class (my test Agent is the mystical 
profitron too :-)) and also an emulation of Subscriptions on the console 
side for the C++ broker ManagementAgent (which doesn't support 
subscriptions) - that feature works by using the periodic broker 
ManagementAgent data indication and wrapping it to look like a Subscription.

Anyway it's nearly finished bar some tarting up of the Javadoc and 
tidying up the tests and demos. I'm going to try and make a concerted 
push this weekend to finish it.

One of the demos is a Java port of qpid-config that uses pure QMF2 to 
add/delete queues/bindings/exchanges, so with respect to QMF remote 
method invocation, as a taster, the QpidConfig addQueue method looks 
like this:


    private void addQueue(String[] args)
    {
        if (args.length < 1)
        {
            usage();
        }

        Map properties = new HashMap();

        for (String a : extraArguments)
        {
            String[] r = a.split("=");
            String value = r.length == 2 ? r[1] : null;
            properties.put(r[0], value);
        }

        if (_durable)
        {
            properties.put("durable", true);
            properties.put(FILECOUNT, _fileCount);
            properties.put(FILESIZE, _fileSize);
        }

        if (_maxQueueSize > 0)
        {
            properties.put(MAX_QUEUE_SIZE, _maxQueueSize);
        }

        if (_maxQueueCount > 0)
        {
            properties.put(MAX_QUEUE_COUNT, _maxQueueCount);
        }

        if (_limitPolicy.equals("reject"))
        {
            properties.put(POLICY_TYPE, "reject");
        }
        else if (_limitPolicy.equals("flow-to-disk"))
        {
            properties.put(POLICY_TYPE, "flow_to_disk");
        }
        else if (_limitPolicy.equals("ring"))
        {
            properties.put(POLICY_TYPE, "ring");
        }
        else if (_limitPolicy.equals("ring-strict"))
        {
            properties.put(POLICY_TYPE, "ring_strict");
        }

        if (_clusterDurable)
        {
            properties.put(CLUSTER_DURABLE, 1l);
        }

        if (_order.equals("lvq"))
        {
            properties.put(LVQ, 1l);
        }
        else if (_order.equals("lvq-no-browse"))
        {
            properties.put(LVQNB, 1l);
        }

        if (_eventGeneration > 0)
        {
            properties.put(QUEUE_EVENT_GENERATION, _eventGeneration);
        }

        if (_altExchange != null)
        {
            properties.put("alternate-exchange", _altExchange);
        }

        if (_flowStopSize > 0)
        {
            properties.put(FLOW_STOP_SIZE, _flowStopSize);
        }

        if (_flowResumeSize > 0)
        {
            properties.put(FLOW_RESUME_SIZE, _flowResumeSize);
        }

        if (_flowStopCount > 0)
        {
            properties.put(FLOW_STOP_COUNT, _flowStopCount);
        }

        if (_flowResumeCount > 0)
        {
            properties.put(FLOW_RESUME_COUNT, _flowResumeCount);
        }

        QmfData arguments = new QmfData();
        arguments.setStringValue("type", "queue");
        arguments.setStringValue("name", args[0]);
        arguments.setValue("properties", properties);

        try
        {
            _broker.invokeMethod("create", arguments);
        }
        catch (QmfException e)
        {
            System.out.println(e.getMessage());
        }
        // passive queue creation not implemented yet (not sure how to 
do it using QMF2)
    }




Ken Giusti wrote:
> Yes - equivalent examples for a python agent and client can be found in cpp/bindings/qmf2/examples/python directory.
>
> -K
>
>
>
>
> ----- Original Message -----
>   
>> Would it be possible to write an agent in python also?
>>
>> Daryoush
>>
>>
>> On Wed, Nov 9, 2011 at 2:01 PM, Ken Giusti <kg...@redhat.com>
>> wrote:
>>
>>     
>>> Hi Daryoush,
>>>
>>> There are some basic examples in
>>> qpid/cpp/bindings/qmf2/examples/cpp/
>>> directory.
>>>
>>> See:
>>>
>>> agent.cpp - an example agent that exposes some method calls (like
>>> "echo").
>>> list_agents.cpp - an example console that listens for agents
>>> connecting to
>>> a broker.
>>>
>>> Unfortunately, there are no examples of making method calls (!)
>>>
>>> I've hacked a quick example of calling the "echo" method exported
>>> by
>>> agent.cpp.  If you apply the patch below to list_agents.cpp
>>> (trunk), it
>>> will attempt to call the "echo" method.
>>>
>>> Fire off a broker (qpidd), start the agent.cpp executable (leave it
>>> running), then run the modified list_agents.cpp.
>>>
>>> didn't test it very well, but it should give you an idea...
>>>
>>>
>>> Index: list_agents.cpp
>>> ===================================================================
>>> --- list_agents.cpp     (revision 1199840)
>>> +++ list_agents.cpp     (working copy)
>>> @@ -21,6 +21,9 @@
>>>  #include <qpid/messaging/Duration.h>
>>>  #include <qmf/ConsoleSession.h>
>>>  #include <qmf/ConsoleEvent.h>
>>> +#include <qmf/Query.h>
>>> +#include <qmf/Data.h>
>>> +#include <qmf/DataAddr.h>
>>>  #include <qmf/Agent.h>
>>>  #include <qpid/types/Variant.h>
>>>  #include <string>
>>> @@ -60,6 +63,40 @@
>>>                 if (event.getAgent().getName() ==
>>> session.getConnectedBrokerAgent().getName())
>>>                     extra = "  [Connected Broker]";
>>>                 cout << "Agent Added: " <<
>>>                 event.getAgent().getName() <<
>>> extra << endl;
>>> +                // find the "Profitron" agent
>>> +                if (event.getAgent().getVendor() ==
>>> "profitron.com") {
>>> +                    Agent myAgent = event.getAgent();
>>> +                    // query the agent for its schema
>>> +                    ConsoleEvent schemaInfo =
>>> event.getAgent().querySchema();
>>> +                    // cout << "Schema Count: " <<
>>> schemaInfo.getSchemaIdCount() << endl;
>>> +                    // Find the Schema identifier for the
>>> "control"
>>> class...
>>> +                    for (int i = 0; i <
>>> schemaInfo.getSchemaIdCount();
>>> ++i) {
>>> +                        SchemaId sid = schemaInfo.getSchemaId(i);
>>> +                        // cout << "SchemaId: " <<
>>> sid.getPackageName()
>>> << ":" << sid.getName() << ":" << sid.getHash() << endl;
>>> +                        if (sid.getName() == "control") {
>>> +                            // now query the agent for all the
>>> "control"
>>> objects - there is only one in this example
>>> +                            Query q(QUERY_OBJECT_ID, sid);
>>> +                            ConsoleEvent obj = myAgent.query(q);
>>> +                            // cout << "Query returned=" <<
>>> obj.getType()
>>> << endl;
>>> +                            // "control" is a singleton, so
>>> getDataCount() returns 1 below
>>> +                            for (int j = 0; j <
>>> obj.getDataCount(); ++j) {
>>> +                                // cout << "addr= " <<
>>> obj.getData(j).getAddr().asMap() << endl;
>>> +
>>> +                                // get the address of the object,
>>> so we
>>> can call methods against it:
>>> +                                DataAddr myObjId =
>>> obj.getData(j).getAddr();
>>> +                                // arguments to "echo" method
>>> +                                Variant::Map args;
>>> +                                Variant::Map map_data;
>>> +                                map_data["hello"] =
>>> Variant("world!");
>>> +                                args["sequence"] = Variant(1);
>>> +                                args["map"] = map_data;
>>> +                                // invoke the method synchronously
>>> +                                ConsoleEvent rc =
>>> event.getAgent().callMethod("echo", args, myObjId);
>>> +                                cout << "results=" <<
>>> rc.getArguments()
>>> << endl;
>>> +                            }
>>> +                        }
>>> +                    }
>>> +                }
>>>             }
>>>             if (event.getType() == CONSOLE_AGENT_DEL) {
>>>                 if (event.getAgentDelReason() == AGENT_DEL_AGED)
>>>
>>>
>>>
>>>
>>>
>>>
>>> ----- Original Message -----
>>>       
>>>> I need to find out of if Qpid's QMF  would work for a simple RPC
>>>> application that I need to develop.     Any samples or tutorials
>>>> showing
>>>> the agent requirements would be greatly appreciated.
>>>>
>>>> Thanks
>>>> Daryoush
>>>>
>>>>         
>>> ---------------------------------------------------------------------
>>> Apache Qpid - AMQP Messaging Implementation
>>> Project:      http://qpid.apache.org
>>> Use/Interact: mailto:users-subscribe@qpid.apache.org
>>>
>>>
>>>       
>> --
>> Daryoush
>>
>> Weblog:  http://onfp.blogspot.com/
>>
>>     
>
> ---------------------------------------------------------------------
> Apache Qpid - AMQP Messaging Implementation
> Project:      http://qpid.apache.org
> Use/Interact: mailto:users-subscribe@qpid.apache.org
>
>
>   


---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:users-subscribe@qpid.apache.org


Re: looking for QMF agent/console sample

Posted by Ken Giusti <kg...@redhat.com>.
Yes - equivalent examples for a python agent and client can be found in cpp/bindings/qmf2/examples/python directory.

-K




----- Original Message -----
> Would it be possible to write an agent in python also?
> 
> Daryoush
> 
> 
> On Wed, Nov 9, 2011 at 2:01 PM, Ken Giusti <kg...@redhat.com>
> wrote:
> 
> > Hi Daryoush,
> >
> > There are some basic examples in
> > qpid/cpp/bindings/qmf2/examples/cpp/
> > directory.
> >
> > See:
> >
> > agent.cpp - an example agent that exposes some method calls (like
> > "echo").
> > list_agents.cpp - an example console that listens for agents
> > connecting to
> > a broker.
> >
> > Unfortunately, there are no examples of making method calls (!)
> >
> > I've hacked a quick example of calling the "echo" method exported
> > by
> > agent.cpp.  If you apply the patch below to list_agents.cpp
> > (trunk), it
> > will attempt to call the "echo" method.
> >
> > Fire off a broker (qpidd), start the agent.cpp executable (leave it
> > running), then run the modified list_agents.cpp.
> >
> > didn't test it very well, but it should give you an idea...
> >
> >
> > Index: list_agents.cpp
> > ===================================================================
> > --- list_agents.cpp     (revision 1199840)
> > +++ list_agents.cpp     (working copy)
> > @@ -21,6 +21,9 @@
> >  #include <qpid/messaging/Duration.h>
> >  #include <qmf/ConsoleSession.h>
> >  #include <qmf/ConsoleEvent.h>
> > +#include <qmf/Query.h>
> > +#include <qmf/Data.h>
> > +#include <qmf/DataAddr.h>
> >  #include <qmf/Agent.h>
> >  #include <qpid/types/Variant.h>
> >  #include <string>
> > @@ -60,6 +63,40 @@
> >                 if (event.getAgent().getName() ==
> > session.getConnectedBrokerAgent().getName())
> >                     extra = "  [Connected Broker]";
> >                 cout << "Agent Added: " <<
> >                 event.getAgent().getName() <<
> > extra << endl;
> > +                // find the "Profitron" agent
> > +                if (event.getAgent().getVendor() ==
> > "profitron.com") {
> > +                    Agent myAgent = event.getAgent();
> > +                    // query the agent for its schema
> > +                    ConsoleEvent schemaInfo =
> > event.getAgent().querySchema();
> > +                    // cout << "Schema Count: " <<
> > schemaInfo.getSchemaIdCount() << endl;
> > +                    // Find the Schema identifier for the
> > "control"
> > class...
> > +                    for (int i = 0; i <
> > schemaInfo.getSchemaIdCount();
> > ++i) {
> > +                        SchemaId sid = schemaInfo.getSchemaId(i);
> > +                        // cout << "SchemaId: " <<
> > sid.getPackageName()
> > << ":" << sid.getName() << ":" << sid.getHash() << endl;
> > +                        if (sid.getName() == "control") {
> > +                            // now query the agent for all the
> > "control"
> > objects - there is only one in this example
> > +                            Query q(QUERY_OBJECT_ID, sid);
> > +                            ConsoleEvent obj = myAgent.query(q);
> > +                            // cout << "Query returned=" <<
> > obj.getType()
> > << endl;
> > +                            // "control" is a singleton, so
> > getDataCount() returns 1 below
> > +                            for (int j = 0; j <
> > obj.getDataCount(); ++j) {
> > +                                // cout << "addr= " <<
> > obj.getData(j).getAddr().asMap() << endl;
> > +
> > +                                // get the address of the object,
> > so we
> > can call methods against it:
> > +                                DataAddr myObjId =
> > obj.getData(j).getAddr();
> > +                                // arguments to "echo" method
> > +                                Variant::Map args;
> > +                                Variant::Map map_data;
> > +                                map_data["hello"] =
> > Variant("world!");
> > +                                args["sequence"] = Variant(1);
> > +                                args["map"] = map_data;
> > +                                // invoke the method synchronously
> > +                                ConsoleEvent rc =
> > event.getAgent().callMethod("echo", args, myObjId);
> > +                                cout << "results=" <<
> > rc.getArguments()
> > << endl;
> > +                            }
> > +                        }
> > +                    }
> > +                }
> >             }
> >             if (event.getType() == CONSOLE_AGENT_DEL) {
> >                 if (event.getAgentDelReason() == AGENT_DEL_AGED)
> >
> >
> >
> >
> >
> >
> > ----- Original Message -----
> > > I need to find out of if Qpid's QMF  would work for a simple RPC
> > > application that I need to develop.     Any samples or tutorials
> > > showing
> > > the agent requirements would be greatly appreciated.
> > >
> > > Thanks
> > > Daryoush
> > >
> >
> > ---------------------------------------------------------------------
> > Apache Qpid - AMQP Messaging Implementation
> > Project:      http://qpid.apache.org
> > Use/Interact: mailto:users-subscribe@qpid.apache.org
> >
> >
> 
> 
> --
> Daryoush
> 
> Weblog:  http://onfp.blogspot.com/
> 

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:users-subscribe@qpid.apache.org


Re: looking for QMF agent/console sample

Posted by Daryoush Mehrtash <dm...@gmail.com>.
Would it be possible to write an agent in python also?

Daryoush


On Wed, Nov 9, 2011 at 2:01 PM, Ken Giusti <kg...@redhat.com> wrote:

> Hi Daryoush,
>
> There are some basic examples in qpid/cpp/bindings/qmf2/examples/cpp/
> directory.
>
> See:
>
> agent.cpp - an example agent that exposes some method calls (like "echo").
> list_agents.cpp - an example console that listens for agents connecting to
> a broker.
>
> Unfortunately, there are no examples of making method calls (!)
>
> I've hacked a quick example of calling the "echo" method exported by
> agent.cpp.  If you apply the patch below to list_agents.cpp (trunk), it
> will attempt to call the "echo" method.
>
> Fire off a broker (qpidd), start the agent.cpp executable (leave it
> running), then run the modified list_agents.cpp.
>
> didn't test it very well, but it should give you an idea...
>
>
> Index: list_agents.cpp
> ===================================================================
> --- list_agents.cpp     (revision 1199840)
> +++ list_agents.cpp     (working copy)
> @@ -21,6 +21,9 @@
>  #include <qpid/messaging/Duration.h>
>  #include <qmf/ConsoleSession.h>
>  #include <qmf/ConsoleEvent.h>
> +#include <qmf/Query.h>
> +#include <qmf/Data.h>
> +#include <qmf/DataAddr.h>
>  #include <qmf/Agent.h>
>  #include <qpid/types/Variant.h>
>  #include <string>
> @@ -60,6 +63,40 @@
>                 if (event.getAgent().getName() ==
> session.getConnectedBrokerAgent().getName())
>                     extra = "  [Connected Broker]";
>                 cout << "Agent Added: " << event.getAgent().getName() <<
> extra << endl;
> +                // find the "Profitron" agent
> +                if (event.getAgent().getVendor() == "profitron.com") {
> +                    Agent myAgent = event.getAgent();
> +                    // query the agent for its schema
> +                    ConsoleEvent schemaInfo =
> event.getAgent().querySchema();
> +                    // cout << "Schema Count: " <<
> schemaInfo.getSchemaIdCount() << endl;
> +                    // Find the Schema identifier for the "control"
> class...
> +                    for (int i = 0; i < schemaInfo.getSchemaIdCount();
> ++i) {
> +                        SchemaId sid = schemaInfo.getSchemaId(i);
> +                        // cout << "SchemaId: " << sid.getPackageName()
> << ":" << sid.getName() << ":" << sid.getHash() << endl;
> +                        if (sid.getName() == "control") {
> +                            // now query the agent for all the "control"
> objects - there is only one in this example
> +                            Query q(QUERY_OBJECT_ID, sid);
> +                            ConsoleEvent obj = myAgent.query(q);
> +                            // cout << "Query returned=" << obj.getType()
> << endl;
> +                            // "control" is a singleton, so
> getDataCount() returns 1 below
> +                            for (int j = 0; j < obj.getDataCount(); ++j) {
> +                                // cout << "addr= " <<
> obj.getData(j).getAddr().asMap() << endl;
> +
> +                                // get the address of the object, so we
> can call methods against it:
> +                                DataAddr myObjId =
> obj.getData(j).getAddr();
> +                                // arguments to "echo" method
> +                                Variant::Map args;
> +                                Variant::Map map_data;
> +                                map_data["hello"] = Variant("world!");
> +                                args["sequence"] = Variant(1);
> +                                args["map"] = map_data;
> +                                // invoke the method synchronously
> +                                ConsoleEvent rc =
> event.getAgent().callMethod("echo", args, myObjId);
> +                                cout << "results=" << rc.getArguments()
> << endl;
> +                            }
> +                        }
> +                    }
> +                }
>             }
>             if (event.getType() == CONSOLE_AGENT_DEL) {
>                 if (event.getAgentDelReason() == AGENT_DEL_AGED)
>
>
>
>
>
>
> ----- Original Message -----
> > I need to find out of if Qpid's QMF  would work for a simple RPC
> > application that I need to develop.     Any samples or tutorials
> > showing
> > the agent requirements would be greatly appreciated.
> >
> > Thanks
> > Daryoush
> >
>
> ---------------------------------------------------------------------
> Apache Qpid - AMQP Messaging Implementation
> Project:      http://qpid.apache.org
> Use/Interact: mailto:users-subscribe@qpid.apache.org
>
>


-- 
Daryoush

Weblog:  http://onfp.blogspot.com/

Re: looking for QMF agent/console sample

Posted by Ken Giusti <kg...@redhat.com>.
Hi Daryoush,

There are some basic examples in qpid/cpp/bindings/qmf2/examples/cpp/ directory.

See:

agent.cpp - an example agent that exposes some method calls (like "echo").
list_agents.cpp - an example console that listens for agents connecting to a broker.

Unfortunately, there are no examples of making method calls (!)

I've hacked a quick example of calling the "echo" method exported by agent.cpp.  If you apply the patch below to list_agents.cpp (trunk), it will attempt to call the "echo" method.

Fire off a broker (qpidd), start the agent.cpp executable (leave it running), then run the modified list_agents.cpp.

didn't test it very well, but it should give you an idea...


Index: list_agents.cpp
===================================================================
--- list_agents.cpp	(revision 1199840)
+++ list_agents.cpp	(working copy)
@@ -21,6 +21,9 @@
 #include <qpid/messaging/Duration.h>
 #include <qmf/ConsoleSession.h>
 #include <qmf/ConsoleEvent.h>
+#include <qmf/Query.h>
+#include <qmf/Data.h>
+#include <qmf/DataAddr.h>
 #include <qmf/Agent.h>
 #include <qpid/types/Variant.h>
 #include <string>
@@ -60,6 +63,40 @@
                 if (event.getAgent().getName() == session.getConnectedBrokerAgent().getName())
                     extra = "  [Connected Broker]";
                 cout << "Agent Added: " << event.getAgent().getName() << extra << endl;
+                // find the "Profitron" agent
+                if (event.getAgent().getVendor() == "profitron.com") {
+                    Agent myAgent = event.getAgent();
+                    // query the agent for its schema
+                    ConsoleEvent schemaInfo = event.getAgent().querySchema();
+                    // cout << "Schema Count: " << schemaInfo.getSchemaIdCount() << endl;
+                    // Find the Schema identifier for the "control" class...
+                    for (int i = 0; i < schemaInfo.getSchemaIdCount(); ++i) {
+                        SchemaId sid = schemaInfo.getSchemaId(i);
+                        // cout << "SchemaId: " << sid.getPackageName() << ":" << sid.getName() << ":" << sid.getHash() << endl;
+                        if (sid.getName() == "control") {
+                            // now query the agent for all the "control" objects - there is only one in this example
+                            Query q(QUERY_OBJECT_ID, sid);
+                            ConsoleEvent obj = myAgent.query(q);
+                            // cout << "Query returned=" << obj.getType() << endl;
+                            // "control" is a singleton, so getDataCount() returns 1 below
+                            for (int j = 0; j < obj.getDataCount(); ++j) {
+                                // cout << "addr= " << obj.getData(j).getAddr().asMap() << endl;
+
+                                // get the address of the object, so we can call methods against it:
+                                DataAddr myObjId = obj.getData(j).getAddr();
+                                // arguments to "echo" method
+                                Variant::Map args;
+                                Variant::Map map_data;
+                                map_data["hello"] = Variant("world!");
+                                args["sequence"] = Variant(1);
+                                args["map"] = map_data;
+                                // invoke the method synchronously
+                                ConsoleEvent rc = event.getAgent().callMethod("echo", args, myObjId);
+                                cout << "results=" << rc.getArguments() << endl;
+                            }
+                        }
+                    }
+                }
             }
             if (event.getType() == CONSOLE_AGENT_DEL) {
                 if (event.getAgentDelReason() == AGENT_DEL_AGED)






----- Original Message -----
> I need to find out of if Qpid's QMF  would work for a simple RPC
> application that I need to develop.     Any samples or tutorials
> showing
> the agent requirements would be greatly appreciated.
> 
> Thanks
> Daryoush
> 

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:users-subscribe@qpid.apache.org