activemq-dev mailing list archives

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

    [ https://issues.apache.org/activemq/browse/AMQCPP-315?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=61566#action_61566
] 

Helen Huang commented on AMQCPP-315:
------------------------------------

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

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
name.

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 :)

 Thanks!





> Advisory messages do not work with multiple listeners
> -----------------------------------------------------
>
>                 Key: AMQCPP-315
>                 URL: https://issues.apache.org/activemq/browse/AMQCPP-315
>             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, AdvisoryMessageListener2.zip, vs2005-build.zip
>
>
> 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.


Mime
View raw message