activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Helen Huang (JIRA)" <>
Subject [jira] Commented: (AMQCPP-315) Advisory messages do not work with multiple listeners
Date Tue, 31 Aug 2010 20:32:41 GMT


Helen Huang commented on AMQCPP-315:

I have looked at the code for IdGenerator again and I think I might understand what is going

std::string IdGenerator::generateId() const {
    std::string result;
    StaticData& statics = IdGenerator::getClassStaticData();
    synchronized( &statics.mutex ) {
        if( seed.empty() ) {
            if( prefix.empty() ) {
                this->seed = std::string( "ID:" ) + statics.hostname +
                             statics.UNIQUE_STUB + Long::toString( statics.instanceCount++
) + ":";
            } else {
                this->seed = prefix + statics.UNIQUE_STUB + Long::toString( statics.instanceCount++
) + ":";
        result = this->seed + Long::toString( this->sequence++ );
    return result;

The second line in this function can be accessed by multiple threads:
StaticData& statics = IdGenerator::getClassStaticData();

The definition for IdGenerator::getClassStaticData() is
IdGenerator::StaticData& IdGenerator::getClassStaticData() {
     static IdGenerator::StaticData statics; 
    return statics;

The constructor of IdGenerator::StaticData calls InetAddress::getLocalHost() to get the host

It seems that this constructor can be entered by multiple threads at the same time and mess
up the apr get host name functionality.

I have fixed the problem by making the "statics" variable a member of IdGenerator, and by
adding the statement of "IdGenerator::StaticData IdGenerator::statics;" to IdGenerator.cpp.

Attached please find the modified code in IdGenerator.h and .cpp. Hope this fix is acceptable
to you :)


> Advisory messages do not work with multiple listeners
> -----------------------------------------------------
>                 Key: AMQCPP-315
>                 URL:
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>    Affects Versions: 3.2.2
>         Environment: Windows, ActiveMQ 5.3.1
>            Reporter: Helen Huang
>            Assignee: Timothy Bish
>         Attachments: activemq.log,,
> We found that the advisory messages do not work as expected when there are multiple consumers
listening to the same advisory topics.
> We have three applications, AdvisoryMessageListener, MessageListener, and MessageSender.
> AdvisoryMessageListener listens to the following two topics:
> ActiveMQ.Advisory.Consumer.Topic.cpp.itemLookup
> ActiveMQ.Advisory.Producer.Topic.cpp.itemLookup
> MessageListener listens to topic: cpp.itemLookup
> MessageSender sends messages to topic: cpp.itemLookup
> If there is only one instance of AdvisoryMessageListener , then everything work fine.
We can get the advisory messages when we start/shut down MessageListener or MessageSender
. However, when we start a second instance of AdvisoryMessageListener , it seems to knock
out the existing connection of the first  AdvisoryMessageListener. The first instance can
no longer receive any advisory messages after that. 
> This problem could be related to the problem reported in jira item "AMQCPP-314 Starting
app with Com using cms destroys connection of other app. New problem with recent lib version".
However in our problem,  we do not have any COM layers.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message