You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@qpid.apache.org by Edlira Nano <ed...@gmail.com> on 2010/01/19 17:46:28 UTC

getObjects() doesn't always work

Hi everyone,

I am using C++ Broker along with C++ Clients built from trunk on RedHat CentOS.

First I noticed that the ./console program from the qmf-console example wasn't
getting any object from the broker (while ping and queuestats work fine)

Then, I did a little program that uses getObjects() from the console
SessionManager
and noticed that it is not getting any queue object every time I call it.

Here is what I'm doing :
- A broker is running on localhost:5672
- A queue named "message_queue" has been created on it (using
declare_queues from the direct example)
- I wrote the following program which uses getObjects() to get a list
of queue objects from the broker,
  looks for the queue named "message_queue" in the list and prints
some information about it. The program
is not even implementing its own ConsoleListener like ./console, but
it'using the default one  :

#include "qpid/console/SessionManager.h"
using namespace std;
using namespace qpid::console;

int main_int(int /*argc*/, char** /*argv*/)
{
  qpid::client::ConnectionSettings connSettings;

  SessionManager sm;
  Broker* broker = sm.addBroker(connSettings);

  Object::Vector list;
  int counter = 0;

  do {
    counter++;
    cout << "Getting queue objects list, attempt no " << counter << endl;
    sm.getObjects(list, "queue");
    cout << "   returned " << list.size() << " elements" << endl;
  }
  while(list.empty());

  for (Object::Vector::iterator i = list.begin(); i != list.end();
       i++) {
    cout << "queue: " << *i << endl;
    if ((i->attrString("name")) == "message_queue") {
      cout << "nbMessages: " << i->attrUint64("msgDepth") << endl;
      cout << "size: " << i->attrUint64("byteDepth") << endl;
      break;
    }
  }
  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;
    }
}

Here are the last lines of the output I get from the above program :

Getting queue objects list, attempt no 705
   returned 0 elements
Getting queue objects list, attempt no 706
   returned 4 elements
queue: org.apache.qpid.broker:queue[0-217-1-0-3]
0-0-1-0-1152921504606846979:message_queue
nbMessages: 11
size: 108

So, i have to do getObjects() 706 times to get a non empty list of
queue objects.
The number of attempts varies from one call to another, the max I get
is around 1200 times, the minimum
120 times.

Does anyone have any idea about this?

Thanks,
Edlira

Re: getObjects() doesn't always work

Posted by Gordon Sim <gs...@redhat.com>.
It has been noted on the user list that the console example for qmf
(c++) doesn't list any objects. This appears to be a regression since
0.5 and I've created a Jira:

   https://issues.apache.org/jira/browse/QPID-2353

As 0.6 is not yet released I thought it would be worth raising the 
question of whether this is a symptom of a serious bug in 0.5 and if so 
whether it would be advisable to get a fix for that onto the 0.6 release 
branch?


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


Re: getObjects() doesn't always work

Posted by Edlira Nano <ed...@gmail.com>.
2010/1/21, Gordon Sim <gs...@redhat.com>:
>
> On 01/21/2010 09:28 AM, Gordon Sim wrote:
>
>> On 01/21/2010 09:11 AM, Edlira Nano wrote:
>>
>>> I would be glad if someone could run the C ++ console program on a C++
>>> broker (Linux version) and compare its output with mine.
>>>
>>
>> I get the same as you on linux (from latest trunk):
>>
>> $ ./examples/qmf-console/console
>> Creating SessionManager
>> Adding broker
>> Package List:
>> getting exchanges...
>> returned 0 elements
>> getting queues...
>> returned 0 elements
>>
>
> This seems to be a regression since 0.5 (where the same example lists
> packages and several objects including the standard exchanges).
>
> I've created a Jira: https://issues.apache.org/jira/browse/QPID-2353.


Ok, thank you :)

I don't know if it's related but the python qmf-tool is also sometimes
printing : Waiting for next periodic update
when I do a list, but most of the time it prints the objects correctly.

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

Re: getObjects() doesn't always work

Posted by Gordon Sim <gs...@redhat.com>.
On 01/21/2010 09:28 AM, Gordon Sim wrote:
> On 01/21/2010 09:11 AM, Edlira Nano wrote:
>> I would be glad if someone could run the C ++ console program on a C++
>> broker (Linux version) and compare its output with mine.
>
> I get the same as you on linux (from latest trunk):
>
> $ ./examples/qmf-console/console
> Creating SessionManager
> Adding broker
> Package List:
> getting exchanges...
> returned 0 elements
> getting queues...
> returned 0 elements

This seems to be a regression since 0.5 (where the same example lists 
packages and several objects including the standard exchanges).

I've created a Jira: https://issues.apache.org/jira/browse/QPID-2353.

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


Re: getObjects() doesn't always work

Posted by Gordon Sim <gs...@redhat.com>.
On 01/21/2010 09:11 AM, Edlira Nano wrote:
> I would be glad if someone could run the C ++ console program on a C++
> broker (Linux version) and compare its output with mine.

I get the same as you on linux (from latest trunk):

$ ./examples/qmf-console/console
Creating SessionManager
Adding broker
Package List:
getting exchanges...
    returned 0 elements
getting queues...
    returned 0 elements


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


Re: getObjects() doesn't always work

Posted by Edlira Nano <ed...@gmail.com>.
2010/1/20, Jon Watte <jw...@gmail.com>:

> Would you expect the behavior of calling getObjects() when you haven't
> provided your own outlet to be to wait until there are some objects to
> return?


Well, when you run the broker there are some default objects created on it:
the default amqp exchanges, management queue, bindings, ....
So there are always "objects" on a running broker. So even if it's some kind
of polling it should return a non empty-list I guess. But I am not very
clear about what an object is really.
Anyway, I am a Qpid newbie too and  for the moment I am just trying to
understand how it is supposed to work rather than expecting things :)
The fact that the console application in the qmf-console C++ example
provided with Qpid returns 0 objects to me on a Linux configuration, but not
on Windows, makes me think that maybe something's wrong with my
configuration. I haven't found any bug report on this example so I guess
it's supposed to work properly.

I would be glad if someone could run the C ++ console program on a C++
broker (Linux version) and compare its output with mine.
You can find console on :
http://svn.apache.org/repos/asf/qpid/trunk/qpid/cpp/examples/qmf-console/
Details on my output are in my previous post on this thread.

Thanks,

Edlira


Actually, as I said in my previous mail, the console application that is in
the qmf-console C++ example (that comes with the
C++ Qpid client + broker in order to demonstrate teh QMF console use)
returns no objects to me.
This application is supposed to
I didn't find any bug reported on this example,




On Wed, Jan 20, 2010 at 3:21 AM, Edlira Nano <ed...@gmail.com> wrote:
>
> > Hi again,
> >
> > I have the same problem of getObjects() returning an empty list when I
> run
> > the ./console program in the C++ qmf-console example from trunk.
> > I always get as output :
> > " Creating SessionManager
> > Adding broker
> > Package List:
> > getting exchanges...
> >   returned 0 elements
> > getting queues...
> >   returned 0 elements "
> >
> > Now I tried adding a sleep(1) right before the getObjects(list, "queue").
> > My
> > output now is :
> > " Creating SessionManager
> > Adding broker
> > Package List:
> > getting exchanges...
> >   returned 0 elements
> > getting queues...
> >   returned 2 elements
> > queue: org.apache.qpid.broker:queue[0-218-1-0-3]
> > 0-0-1-0-1152921504606846979:message_queue
> >   bindingCount=2
> >  arguments={}
> > queue: org.apache.qpid.broker:queue[0-218-1-0-555]
> > 0-0-1-0-1152921504606846979:qmfc-4a785e26-5e71-46dd-b595-8abab0f83352
> >  bindingCount=4
> >  arguments={}
> > Broker: org.apache.qpid.broker:broker[0-0-1-0-1152921504606846978]
> > 0-0-1-0-1152921504606846977:5672
> > Call echo method...
> > Result: code=0 text=OK
> >   Output Arg: body => Testing...
> >   Output Arg: sequence => 1"
> >
> > So it does get a non-empty queue-objects list but an empty exchanges
> list.
> > Now, adding a sleep(1) right before the getObjects(list, "exchange") and
> > removing the sleep(1) before the getObjects(list, "queue") :
> > "
> > Creating SessionManager
> > Adding broker
> > Package List:
> > getting exchanges...
> >   returned 6 elements
> > ....."listing the exchanges"
> > getting queues...
> >   returned 2 elements
> > queue: org.apache.qpid.broker:queue[0-218-1-0-3]
> > 0-0-1-0-1152921504606846979:message_queue
> >   bindingCount=2
> >  arguments={}
> > queue: org.apache.qpid.broker:queue[0-218-1-0-563]
> > 0-0-1-0-1152921504606846979:qmfc-aa1d0774-417a-48d5-8af1-a18805b2f532
> >  bindingCount=4
> >  arguments={}
> > Broker: org.apache.qpid.broker:broker[0-0-1-0-1152921504606846978]
> > 0-0-1-0-1152921504606846977:5672
> > Call echo method...
> > Result: code=0 text=OK
> >   Output Arg: body => Testing...
> >   Output Arg: sequence => 1
> > "
> > So now I get a non-empty list every time I call getObjects().
> >
> > So new question :
> >  Is the native ./console example behaving the same way as on my CentOs
> > (with
> > qpid from trunk)
> > on other Linux platforms you guys are using?( I know it  behaves as it
> > should on the Windows version of the example).
> > Cause maybe there's something particular with my configuration. The only
> > odd
> > thing  I have noticed so far with my broker
> > is that I have continous warnings "Timer woken up Xms late". Maybe
> somehow
> > this is the cause of all it.
> >
> > Thanks again :)
> > Edlira,
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > 2010/1/20, Edlira Nano <ed...@gmail.com>:
> > >
> > > Thanks for your answer :)
> > >
> > > Indeed, when I add a sleep(1), the getObjects() seems to always return
> a
> > > non empty object list at first attempt.
> > > But the problem is that according to documentation my program is
> supposed
> > > to do synchronous-only operations.
> > > Maybe I have misunderstood something, but in the
> console/SessionManager.h
> > > class one can read :
> > >
> > > "/** Create a new SessionManager
> > >  *
> > >  * Provide your own subclass of ConsoleListener to receive updates and
> > indications
> > >  * asynchronously or leave it as its default and use only synchronous
> > methods. ...
> > >
> > >
> > >  QPID_CONSOLE_EXTERN SessionManager(ConsoleListener* listener = 0,
> > >                                        Settings settings =
> Settings());"
> > >
> > >
> > > My program uses the default  listener, I thought that the C++
> > getObjects()
> > > would therefore work
> > > synchronously, as it does when following the QMF python console
> tutorial
> > > synchronous style.
> > >
> > > So my question is :
> > > I want no updates on my objects, is there a way to use the C++
> > getObjects()
> > > in a synchronous style like in the qmf python console
> > > (which by the way works fine for me, I never get an empty list of
> objects
> > > with that)?
> > >
> > > Edlira,
> > >
> > > 2010/1/19, Jon Watte <jw...@gmail.com>:
> > >
> > >> Here's just guessing from reading the code you posted:
> > >>
> > >> That looks like a spin loop to me. If the objects arrive
> asynchronously,
> > >> you
> > >> won't know how many iterations it will take, because it is timing
> > >> dependent.
> > >> If you add sleep(1) right before you call getObjects() in the loop,
> how
> > >> does
> > >> it behave in that case?
> > >>
> > >> If the documentation contradicts this guess, then I'd vote for
> trusting
> > >> the
> > >> documentation, though :-)
> > >>
> > >> Sincerely,
> > >>
> > >> jw
> > >>
> > >>
> > >>
> > >>
> > >> --
> > >> Americans might object: there is no way we would sacrifice our living
> > >> standards for the benefit of people in the rest of the world.
> > >> Nevertheless,
> > >> whether we get there willingly or not, we shall soon have lower
> > >> consumption
> > >> rates, because our present rates are unsustainable.
> > >>
> > >>
> > >>
> > >>
> > >> On Tue, Jan 19, 2010 at 8:46 AM, Edlira Nano <ed...@gmail.com>
> > >> wrote:
> > >>
> > >> > Hi everyone,
> > >> >
> > >> > I am using C++ Broker along with C++ Clients built from trunk on
> > RedHat
> > >> > CentOS.
> > >> >
> > >> > First I noticed that the ./console program from the qmf-console
> > example
> > >> > wasn't
> > >> > getting any object from the broker (while ping and queuestats work
> > fine)
> > >> >
> > >> > Then, I did a little program that uses getObjects() from the console
> > >> > SessionManager
> > >> > and noticed that it is not getting any queue object every time I
> call
> > >> it.
> > >> >
> > >> > Here is what I'm doing :
> > >> > - A broker is running on localhost:5672
> > >> > - A queue named "message_queue" has been created on it (using
> > >> > declare_queues from the direct example)
> > >> > - I wrote the following program which uses getObjects() to get a
> list
> > >> > of queue objects from the broker,
> > >> >  looks for the queue named "message_queue" in the list and prints
> > >> > some information about it. The program
> > >> > is not even implementing its own ConsoleListener like ./console, but
> > >> > it'using the default one  :
> > >> >
> > >> > #include "qpid/console/SessionManager.h"
> > >> > using namespace std;
> > >> > using namespace qpid::console;
> > >> >
> > >> > int main_int(int /*argc*/, char** /*argv*/)
> > >> > {
> > >> >  qpid::client::ConnectionSettings connSettings;
> > >> >
> > >> >  SessionManager sm;
> > >> >  Broker* broker = sm.addBroker(connSettings);
> > >> >
> > >> >  Object::Vector list;
> > >> >  int counter = 0;
> > >> >
> > >> >  do {
> > >> >    counter++;
> > >> >    cout << "Getting queue objects list, attempt no " << counter <<
> > endl;
> > >> >    sm.getObjects(list, "queue");
> > >> >    cout << "   returned " << list.size() << " elements" << endl;
> > >> >  }
> > >> >  while(list.empty());
> > >> >
> > >> >  for (Object::Vector::iterator i = list.begin(); i != list.end();
> > >> >       i++) {
> > >> >    cout << "queue: " << *i << endl;
> > >> >    if ((i->attrString("name")) == "message_queue") {
> > >> >      cout << "nbMessages: " << i->attrUint64("msgDepth") << endl;
> > >> >      cout << "size: " << i->attrUint64("byteDepth") << endl;
> > >> >      break;
> > >> >    }
> > >> >  }
> > >> >  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;
> > >> >    }
> > >> > }
> > >> >
> > >> > Here are the last lines of the output I get from the above program :
> > >> >
> > >> > Getting queue objects list, attempt no 705
> > >> >   returned 0 elements
> > >> > Getting queue objects list, attempt no 706
> > >> >   returned 4 elements
> > >> > queue: org.apache.qpid.broker:queue[0-217-1-0-3]
> > >> > 0-0-1-0-1152921504606846979:message_queue
> > >> > nbMessages: 11
> > >> > size: 108
> > >> >
> > >> > So, i have to do getObjects() 706 times to get a non empty list of
> > >> > queue objects.
> > >> > The number of attempts varies from one call to another, the max I
> get
> > >> > is around 1200 times, the minimum
> > >> > 120 times.
> > >> >
> > >> > Does anyone have any idea about this?
> > >> >
> > >> > Thanks,
> > >> > Edlira
> > >> >
> > >>
> > >
> > >
> >
>

Re: getObjects() doesn't always work

Posted by Jon Watte <jw...@gmail.com>.
It may be that "synchronous" in this case means something more like
"polling." Calling getObjects() may just check whether any objects are
currently waiting to receive, and if not, return nothing.
However, I'm just a QPID newbie, so I wouldn't know if this is expected
behavior or something akin to a bug.
Would you expect the behavior of calling getObjects() when you haven't
provided your own outlet to be to wait until there are some objects to
return?

Sincerely,

jw


--
Americans might object: there is no way we would sacrifice our living
standards for the benefit of people in the rest of the world. Nevertheless,
whether we get there willingly or not, we shall soon have lower consumption
rates, because our present rates are unsustainable.



On Wed, Jan 20, 2010 at 3:21 AM, Edlira Nano <ed...@gmail.com> wrote:

> Hi again,
>
> I have the same problem of getObjects() returning an empty list when I run
> the ./console program in the C++ qmf-console example from trunk.
> I always get as output :
> " Creating SessionManager
> Adding broker
> Package List:
> getting exchanges...
>   returned 0 elements
> getting queues...
>   returned 0 elements "
>
> Now I tried adding a sleep(1) right before the getObjects(list, "queue").
> My
> output now is :
> " Creating SessionManager
> Adding broker
> Package List:
> getting exchanges...
>   returned 0 elements
> getting queues...
>   returned 2 elements
> queue: org.apache.qpid.broker:queue[0-218-1-0-3]
> 0-0-1-0-1152921504606846979:message_queue
>   bindingCount=2
>  arguments={}
> queue: org.apache.qpid.broker:queue[0-218-1-0-555]
> 0-0-1-0-1152921504606846979:qmfc-4a785e26-5e71-46dd-b595-8abab0f83352
>  bindingCount=4
>  arguments={}
> Broker: org.apache.qpid.broker:broker[0-0-1-0-1152921504606846978]
> 0-0-1-0-1152921504606846977:5672
> Call echo method...
> Result: code=0 text=OK
>   Output Arg: body => Testing...
>   Output Arg: sequence => 1"
>
> So it does get a non-empty queue-objects list but an empty exchanges list.
> Now, adding a sleep(1) right before the getObjects(list, "exchange") and
> removing the sleep(1) before the getObjects(list, "queue") :
> "
> Creating SessionManager
> Adding broker
> Package List:
> getting exchanges...
>   returned 6 elements
> ....."listing the exchanges"
> getting queues...
>   returned 2 elements
> queue: org.apache.qpid.broker:queue[0-218-1-0-3]
> 0-0-1-0-1152921504606846979:message_queue
>   bindingCount=2
>  arguments={}
> queue: org.apache.qpid.broker:queue[0-218-1-0-563]
> 0-0-1-0-1152921504606846979:qmfc-aa1d0774-417a-48d5-8af1-a18805b2f532
>  bindingCount=4
>  arguments={}
> Broker: org.apache.qpid.broker:broker[0-0-1-0-1152921504606846978]
> 0-0-1-0-1152921504606846977:5672
> Call echo method...
> Result: code=0 text=OK
>   Output Arg: body => Testing...
>   Output Arg: sequence => 1
> "
> So now I get a non-empty list every time I call getObjects().
>
> So new question :
>  Is the native ./console example behaving the same way as on my CentOs
> (with
> qpid from trunk)
> on other Linux platforms you guys are using?( I know it  behaves as it
> should on the Windows version of the example).
> Cause maybe there's something particular with my configuration. The only
> odd
> thing  I have noticed so far with my broker
> is that I have continous warnings "Timer woken up Xms late". Maybe somehow
> this is the cause of all it.
>
> Thanks again :)
> Edlira,
>
>
>
>
>
>
>
>
>
>
>
> 2010/1/20, Edlira Nano <ed...@gmail.com>:
> >
> > Thanks for your answer :)
> >
> > Indeed, when I add a sleep(1), the getObjects() seems to always return a
> > non empty object list at first attempt.
> > But the problem is that according to documentation my program is supposed
> > to do synchronous-only operations.
> > Maybe I have misunderstood something, but in the console/SessionManager.h
> > class one can read :
> >
> > "/** Create a new SessionManager
> >  *
> >  * Provide your own subclass of ConsoleListener to receive updates and
> indications
> >  * asynchronously or leave it as its default and use only synchronous
> methods. ...
> >
> >
> >  QPID_CONSOLE_EXTERN SessionManager(ConsoleListener* listener = 0,
> >                                        Settings settings = Settings());"
> >
> >
> > My program uses the default  listener, I thought that the C++
> getObjects()
> > would therefore work
> > synchronously, as it does when following the QMF python console tutorial
> > synchronous style.
> >
> > So my question is :
> > I want no updates on my objects, is there a way to use the C++
> getObjects()
> > in a synchronous style like in the qmf python console
> > (which by the way works fine for me, I never get an empty list of objects
> > with that)?
> >
> > Edlira,
> >
> > 2010/1/19, Jon Watte <jw...@gmail.com>:
> >
> >> Here's just guessing from reading the code you posted:
> >>
> >> That looks like a spin loop to me. If the objects arrive asynchronously,
> >> you
> >> won't know how many iterations it will take, because it is timing
> >> dependent.
> >> If you add sleep(1) right before you call getObjects() in the loop, how
> >> does
> >> it behave in that case?
> >>
> >> If the documentation contradicts this guess, then I'd vote for trusting
> >> the
> >> documentation, though :-)
> >>
> >> Sincerely,
> >>
> >> jw
> >>
> >>
> >>
> >>
> >> --
> >> Americans might object: there is no way we would sacrifice our living
> >> standards for the benefit of people in the rest of the world.
> >> Nevertheless,
> >> whether we get there willingly or not, we shall soon have lower
> >> consumption
> >> rates, because our present rates are unsustainable.
> >>
> >>
> >>
> >>
> >> On Tue, Jan 19, 2010 at 8:46 AM, Edlira Nano <ed...@gmail.com>
> >> wrote:
> >>
> >> > Hi everyone,
> >> >
> >> > I am using C++ Broker along with C++ Clients built from trunk on
> RedHat
> >> > CentOS.
> >> >
> >> > First I noticed that the ./console program from the qmf-console
> example
> >> > wasn't
> >> > getting any object from the broker (while ping and queuestats work
> fine)
> >> >
> >> > Then, I did a little program that uses getObjects() from the console
> >> > SessionManager
> >> > and noticed that it is not getting any queue object every time I call
> >> it.
> >> >
> >> > Here is what I'm doing :
> >> > - A broker is running on localhost:5672
> >> > - A queue named "message_queue" has been created on it (using
> >> > declare_queues from the direct example)
> >> > - I wrote the following program which uses getObjects() to get a list
> >> > of queue objects from the broker,
> >> >  looks for the queue named "message_queue" in the list and prints
> >> > some information about it. The program
> >> > is not even implementing its own ConsoleListener like ./console, but
> >> > it'using the default one  :
> >> >
> >> > #include "qpid/console/SessionManager.h"
> >> > using namespace std;
> >> > using namespace qpid::console;
> >> >
> >> > int main_int(int /*argc*/, char** /*argv*/)
> >> > {
> >> >  qpid::client::ConnectionSettings connSettings;
> >> >
> >> >  SessionManager sm;
> >> >  Broker* broker = sm.addBroker(connSettings);
> >> >
> >> >  Object::Vector list;
> >> >  int counter = 0;
> >> >
> >> >  do {
> >> >    counter++;
> >> >    cout << "Getting queue objects list, attempt no " << counter <<
> endl;
> >> >    sm.getObjects(list, "queue");
> >> >    cout << "   returned " << list.size() << " elements" << endl;
> >> >  }
> >> >  while(list.empty());
> >> >
> >> >  for (Object::Vector::iterator i = list.begin(); i != list.end();
> >> >       i++) {
> >> >    cout << "queue: " << *i << endl;
> >> >    if ((i->attrString("name")) == "message_queue") {
> >> >      cout << "nbMessages: " << i->attrUint64("msgDepth") << endl;
> >> >      cout << "size: " << i->attrUint64("byteDepth") << endl;
> >> >      break;
> >> >    }
> >> >  }
> >> >  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;
> >> >    }
> >> > }
> >> >
> >> > Here are the last lines of the output I get from the above program :
> >> >
> >> > Getting queue objects list, attempt no 705
> >> >   returned 0 elements
> >> > Getting queue objects list, attempt no 706
> >> >   returned 4 elements
> >> > queue: org.apache.qpid.broker:queue[0-217-1-0-3]
> >> > 0-0-1-0-1152921504606846979:message_queue
> >> > nbMessages: 11
> >> > size: 108
> >> >
> >> > So, i have to do getObjects() 706 times to get a non empty list of
> >> > queue objects.
> >> > The number of attempts varies from one call to another, the max I get
> >> > is around 1200 times, the minimum
> >> > 120 times.
> >> >
> >> > Does anyone have any idea about this?
> >> >
> >> > Thanks,
> >> > Edlira
> >> >
> >>
> >
> >
>

Re: getObjects() doesn't always work

Posted by Edlira Nano <ed...@gmail.com>.
Hi again,

I have the same problem of getObjects() returning an empty list when I run
the ./console program in the C++ qmf-console example from trunk.
I always get as output :
" Creating SessionManager
Adding broker
Package List:
getting exchanges...
   returned 0 elements
getting queues...
   returned 0 elements "

Now I tried adding a sleep(1) right before the getObjects(list, "queue"). My
output now is :
" Creating SessionManager
Adding broker
Package List:
getting exchanges...
   returned 0 elements
getting queues...
   returned 2 elements
queue: org.apache.qpid.broker:queue[0-218-1-0-3]
0-0-1-0-1152921504606846979:message_queue
  bindingCount=2
  arguments={}
queue: org.apache.qpid.broker:queue[0-218-1-0-555]
0-0-1-0-1152921504606846979:qmfc-4a785e26-5e71-46dd-b595-8abab0f83352
  bindingCount=4
  arguments={}
Broker: org.apache.qpid.broker:broker[0-0-1-0-1152921504606846978]
0-0-1-0-1152921504606846977:5672
Call echo method...
Result: code=0 text=OK
   Output Arg: body => Testing...
   Output Arg: sequence => 1"

So it does get a non-empty queue-objects list but an empty exchanges list.
Now, adding a sleep(1) right before the getObjects(list, "exchange") and
removing the sleep(1) before the getObjects(list, "queue") :
"
Creating SessionManager
Adding broker
Package List:
getting exchanges...
   returned 6 elements
....."listing the exchanges"
getting queues...
   returned 2 elements
queue: org.apache.qpid.broker:queue[0-218-1-0-3]
0-0-1-0-1152921504606846979:message_queue
  bindingCount=2
  arguments={}
queue: org.apache.qpid.broker:queue[0-218-1-0-563]
0-0-1-0-1152921504606846979:qmfc-aa1d0774-417a-48d5-8af1-a18805b2f532
  bindingCount=4
  arguments={}
Broker: org.apache.qpid.broker:broker[0-0-1-0-1152921504606846978]
0-0-1-0-1152921504606846977:5672
Call echo method...
Result: code=0 text=OK
   Output Arg: body => Testing...
   Output Arg: sequence => 1
"
So now I get a non-empty list every time I call getObjects().

So new question :
 Is the native ./console example behaving the same way as on my CentOs (with
qpid from trunk)
on other Linux platforms you guys are using?( I know it  behaves as it
should on the Windows version of the example).
Cause maybe there's something particular with my configuration. The only odd
thing  I have noticed so far with my broker
is that I have continous warnings "Timer woken up Xms late". Maybe somehow
this is the cause of all it.

Thanks again :)
Edlira,











2010/1/20, Edlira Nano <ed...@gmail.com>:
>
> Thanks for your answer :)
>
> Indeed, when I add a sleep(1), the getObjects() seems to always return a
> non empty object list at first attempt.
> But the problem is that according to documentation my program is supposed
> to do synchronous-only operations.
> Maybe I have misunderstood something, but in the console/SessionManager.h
> class one can read :
>
> "/** Create a new SessionManager
>  *
>  * Provide your own subclass of ConsoleListener to receive updates and indications
>  * asynchronously or leave it as its default and use only synchronous methods. ...
>
>
>  QPID_CONSOLE_EXTERN SessionManager(ConsoleListener* listener = 0,
>                                        Settings settings = Settings());"
>
>
> My program uses the default  listener, I thought that the C++ getObjects()
> would therefore work
> synchronously, as it does when following the QMF python console tutorial
> synchronous style.
>
> So my question is :
> I want no updates on my objects, is there a way to use the C++ getObjects()
> in a synchronous style like in the qmf python console
> (which by the way works fine for me, I never get an empty list of objects
> with that)?
>
> Edlira,
>
> 2010/1/19, Jon Watte <jw...@gmail.com>:
>
>> Here's just guessing from reading the code you posted:
>>
>> That looks like a spin loop to me. If the objects arrive asynchronously,
>> you
>> won't know how many iterations it will take, because it is timing
>> dependent.
>> If you add sleep(1) right before you call getObjects() in the loop, how
>> does
>> it behave in that case?
>>
>> If the documentation contradicts this guess, then I'd vote for trusting
>> the
>> documentation, though :-)
>>
>> Sincerely,
>>
>> jw
>>
>>
>>
>>
>> --
>> Americans might object: there is no way we would sacrifice our living
>> standards for the benefit of people in the rest of the world.
>> Nevertheless,
>> whether we get there willingly or not, we shall soon have lower
>> consumption
>> rates, because our present rates are unsustainable.
>>
>>
>>
>>
>> On Tue, Jan 19, 2010 at 8:46 AM, Edlira Nano <ed...@gmail.com>
>> wrote:
>>
>> > Hi everyone,
>> >
>> > I am using C++ Broker along with C++ Clients built from trunk on RedHat
>> > CentOS.
>> >
>> > First I noticed that the ./console program from the qmf-console example
>> > wasn't
>> > getting any object from the broker (while ping and queuestats work fine)
>> >
>> > Then, I did a little program that uses getObjects() from the console
>> > SessionManager
>> > and noticed that it is not getting any queue object every time I call
>> it.
>> >
>> > Here is what I'm doing :
>> > - A broker is running on localhost:5672
>> > - A queue named "message_queue" has been created on it (using
>> > declare_queues from the direct example)
>> > - I wrote the following program which uses getObjects() to get a list
>> > of queue objects from the broker,
>> >  looks for the queue named "message_queue" in the list and prints
>> > some information about it. The program
>> > is not even implementing its own ConsoleListener like ./console, but
>> > it'using the default one  :
>> >
>> > #include "qpid/console/SessionManager.h"
>> > using namespace std;
>> > using namespace qpid::console;
>> >
>> > int main_int(int /*argc*/, char** /*argv*/)
>> > {
>> >  qpid::client::ConnectionSettings connSettings;
>> >
>> >  SessionManager sm;
>> >  Broker* broker = sm.addBroker(connSettings);
>> >
>> >  Object::Vector list;
>> >  int counter = 0;
>> >
>> >  do {
>> >    counter++;
>> >    cout << "Getting queue objects list, attempt no " << counter << endl;
>> >    sm.getObjects(list, "queue");
>> >    cout << "   returned " << list.size() << " elements" << endl;
>> >  }
>> >  while(list.empty());
>> >
>> >  for (Object::Vector::iterator i = list.begin(); i != list.end();
>> >       i++) {
>> >    cout << "queue: " << *i << endl;
>> >    if ((i->attrString("name")) == "message_queue") {
>> >      cout << "nbMessages: " << i->attrUint64("msgDepth") << endl;
>> >      cout << "size: " << i->attrUint64("byteDepth") << endl;
>> >      break;
>> >    }
>> >  }
>> >  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;
>> >    }
>> > }
>> >
>> > Here are the last lines of the output I get from the above program :
>> >
>> > Getting queue objects list, attempt no 705
>> >   returned 0 elements
>> > Getting queue objects list, attempt no 706
>> >   returned 4 elements
>> > queue: org.apache.qpid.broker:queue[0-217-1-0-3]
>> > 0-0-1-0-1152921504606846979:message_queue
>> > nbMessages: 11
>> > size: 108
>> >
>> > So, i have to do getObjects() 706 times to get a non empty list of
>> > queue objects.
>> > The number of attempts varies from one call to another, the max I get
>> > is around 1200 times, the minimum
>> > 120 times.
>> >
>> > Does anyone have any idea about this?
>> >
>> > Thanks,
>> > Edlira
>> >
>>
>
>

Re: getObjects() doesn't always work

Posted by Edlira Nano <ed...@gmail.com>.
Thanks for your answer :)

Indeed, when I add a sleep(1), the getObjects() seems to always return a non
empty object list at first attempt.
But the problem is that according to documentation my program is supposed to
do synchronous-only operations.
Maybe I have misunderstood something, but in the console/SessionManager.h
class one can read :

"/** Create a new SessionManager
 *
 * Provide your own subclass of ConsoleListener to receive updates and
indications
 * asynchronously or leave it as its default and use only synchronous
methods. ...

 QPID_CONSOLE_EXTERN SessionManager(ConsoleListener* listener = 0,
                                       Settings settings = Settings());"


My program uses the default  listener, I thought that the C++ getObjects()
would therefore work
synchronously, as it does when following the QMF python console tutorial
synchronous style.

So my question is :
I want no updates on my objects, is there a way to use the C++ getObjects()
in a synchronous style like in the qmf python console
(which by the way works fine for me, I never get an empty list of objects
with that)?

Edlira,

2010/1/19, Jon Watte <jw...@gmail.com>:
>
> Here's just guessing from reading the code you posted:
>
> That looks like a spin loop to me. If the objects arrive asynchronously,
> you
> won't know how many iterations it will take, because it is timing
> dependent.
> If you add sleep(1) right before you call getObjects() in the loop, how
> does
> it behave in that case?
>
> If the documentation contradicts this guess, then I'd vote for trusting the
> documentation, though :-)
>
> Sincerely,
>
> jw
>
>
>
>
> --
> Americans might object: there is no way we would sacrifice our living
> standards for the benefit of people in the rest of the world. Nevertheless,
> whether we get there willingly or not, we shall soon have lower consumption
> rates, because our present rates are unsustainable.
>
>
>
>
> On Tue, Jan 19, 2010 at 8:46 AM, Edlira Nano <ed...@gmail.com>
> wrote:
>
> > Hi everyone,
> >
> > I am using C++ Broker along with C++ Clients built from trunk on RedHat
> > CentOS.
> >
> > First I noticed that the ./console program from the qmf-console example
> > wasn't
> > getting any object from the broker (while ping and queuestats work fine)
> >
> > Then, I did a little program that uses getObjects() from the console
> > SessionManager
> > and noticed that it is not getting any queue object every time I call it.
> >
> > Here is what I'm doing :
> > - A broker is running on localhost:5672
> > - A queue named "message_queue" has been created on it (using
> > declare_queues from the direct example)
> > - I wrote the following program which uses getObjects() to get a list
> > of queue objects from the broker,
> >  looks for the queue named "message_queue" in the list and prints
> > some information about it. The program
> > is not even implementing its own ConsoleListener like ./console, but
> > it'using the default one  :
> >
> > #include "qpid/console/SessionManager.h"
> > using namespace std;
> > using namespace qpid::console;
> >
> > int main_int(int /*argc*/, char** /*argv*/)
> > {
> >  qpid::client::ConnectionSettings connSettings;
> >
> >  SessionManager sm;
> >  Broker* broker = sm.addBroker(connSettings);
> >
> >  Object::Vector list;
> >  int counter = 0;
> >
> >  do {
> >    counter++;
> >    cout << "Getting queue objects list, attempt no " << counter << endl;
> >    sm.getObjects(list, "queue");
> >    cout << "   returned " << list.size() << " elements" << endl;
> >  }
> >  while(list.empty());
> >
> >  for (Object::Vector::iterator i = list.begin(); i != list.end();
> >       i++) {
> >    cout << "queue: " << *i << endl;
> >    if ((i->attrString("name")) == "message_queue") {
> >      cout << "nbMessages: " << i->attrUint64("msgDepth") << endl;
> >      cout << "size: " << i->attrUint64("byteDepth") << endl;
> >      break;
> >    }
> >  }
> >  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;
> >    }
> > }
> >
> > Here are the last lines of the output I get from the above program :
> >
> > Getting queue objects list, attempt no 705
> >   returned 0 elements
> > Getting queue objects list, attempt no 706
> >   returned 4 elements
> > queue: org.apache.qpid.broker:queue[0-217-1-0-3]
> > 0-0-1-0-1152921504606846979:message_queue
> > nbMessages: 11
> > size: 108
> >
> > So, i have to do getObjects() 706 times to get a non empty list of
> > queue objects.
> > The number of attempts varies from one call to another, the max I get
> > is around 1200 times, the minimum
> > 120 times.
> >
> > Does anyone have any idea about this?
> >
> > Thanks,
> > Edlira
> >
>

Re: getObjects() doesn't always work

Posted by Jon Watte <jw...@gmail.com>.
Here's just guessing from reading the code you posted:

That looks like a spin loop to me. If the objects arrive asynchronously, you
won't know how many iterations it will take, because it is timing dependent.
If you add sleep(1) right before you call getObjects() in the loop, how does
it behave in that case?

If the documentation contradicts this guess, then I'd vote for trusting the
documentation, though :-)

Sincerely,

jw



--
Americans might object: there is no way we would sacrifice our living
standards for the benefit of people in the rest of the world. Nevertheless,
whether we get there willingly or not, we shall soon have lower consumption
rates, because our present rates are unsustainable.



On Tue, Jan 19, 2010 at 8:46 AM, Edlira Nano <ed...@gmail.com> wrote:

> Hi everyone,
>
> I am using C++ Broker along with C++ Clients built from trunk on RedHat
> CentOS.
>
> First I noticed that the ./console program from the qmf-console example
> wasn't
> getting any object from the broker (while ping and queuestats work fine)
>
> Then, I did a little program that uses getObjects() from the console
> SessionManager
> and noticed that it is not getting any queue object every time I call it.
>
> Here is what I'm doing :
> - A broker is running on localhost:5672
> - A queue named "message_queue" has been created on it (using
> declare_queues from the direct example)
> - I wrote the following program which uses getObjects() to get a list
> of queue objects from the broker,
>  looks for the queue named "message_queue" in the list and prints
> some information about it. The program
> is not even implementing its own ConsoleListener like ./console, but
> it'using the default one  :
>
> #include "qpid/console/SessionManager.h"
> using namespace std;
> using namespace qpid::console;
>
> int main_int(int /*argc*/, char** /*argv*/)
> {
>  qpid::client::ConnectionSettings connSettings;
>
>  SessionManager sm;
>  Broker* broker = sm.addBroker(connSettings);
>
>  Object::Vector list;
>  int counter = 0;
>
>  do {
>    counter++;
>    cout << "Getting queue objects list, attempt no " << counter << endl;
>    sm.getObjects(list, "queue");
>    cout << "   returned " << list.size() << " elements" << endl;
>  }
>  while(list.empty());
>
>  for (Object::Vector::iterator i = list.begin(); i != list.end();
>       i++) {
>    cout << "queue: " << *i << endl;
>    if ((i->attrString("name")) == "message_queue") {
>      cout << "nbMessages: " << i->attrUint64("msgDepth") << endl;
>      cout << "size: " << i->attrUint64("byteDepth") << endl;
>      break;
>    }
>  }
>  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;
>    }
> }
>
> Here are the last lines of the output I get from the above program :
>
> Getting queue objects list, attempt no 705
>   returned 0 elements
> Getting queue objects list, attempt no 706
>   returned 4 elements
> queue: org.apache.qpid.broker:queue[0-217-1-0-3]
> 0-0-1-0-1152921504606846979:message_queue
> nbMessages: 11
> size: 108
>
> So, i have to do getObjects() 706 times to get a non empty list of
> queue objects.
> The number of attempts varies from one call to another, the max I get
> is around 1200 times, the minimum
> 120 times.
>
> Does anyone have any idea about this?
>
> Thanks,
> Edlira
>