[ 
https://issues.apache.org/activemq/browse/AMQCPP-59?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_38024
 ] 

Nathan Mittler commented on AMQCPP-59:
--------------------------------------

Albert,
I think the issue was your main module.  It wasn't destroying the resources it 
allocated each time through the loop.  I've fixed this in the code below.  Give 
it a try and see if you're still having problems.

{code:title=main.cpp|borderStyle=solid}
#include <activemq/core/ActiveMQConnectionFactory.h>
#include <cms/ExceptionListener.h>
#include <cms/Session.h>
#include <iostream>

struct ExceptionListener : public cms::ExceptionListener {
    bool error;

    ExceptionListener() : error(false) {}

    virtual ~ExceptionListener(void) {}
   
    virtual void onException( const cms::CMSException& ex ) {
        std::cout << "Got an exception in listener: " << ex.getMessage() << 
std::endl;
        error = true;
    }
};

ExceptionListener exListener;

activemq::core::ActiveMQConnectionFactory* connectionFactory = NULL;
cms::Connection* connection = NULL;
cms::Session* session = NULL;
cms::Destination* destination = NULL;
cms::MessageConsumer* consumer = NULL;

void cleanup(){
    if( consumer != NULL ){
        delete consumer;
        consumer = NULL;
    }
    if( destination != NULL ){
        delete destination;
        destination = NULL;
    }
    if( session != NULL ){
        delete session;
        session = NULL;
    }
    if( connection != NULL ){
        delete connection;
        connection = NULL;
    }
    if( connectionFactory != NULL ){
        delete connectionFactory;
        connectionFactory = 0;
    }
    exListener.error = false;
}

int main(int argc, char* argv[]) {
    
    while( true ) {
        try {
            activemq::core::ActiveMQConnectionFactory* connectionFactory =
                new 
activemq::core::ActiveMQConnectionFactory("tcp://127.0.0.1:61613");
            connection = connectionFactory->createConnection();
            connection->setExceptionListener(&exListener);
            session = connection->createSession( cms::Session::AUTO_ACKNOWLEDGE 
);
            destination = session->createTopic( "TEST.FOO" );
            consumer = session->createConsumer( destination );
            connection->start();
            cms::Message* message = consumer->receive(10000);
            delete message;
            message = 0;
            cleanup();
        } catch ( cms::CMSException& ex ) {
            std::cout << "Got an exception: " << ex.getMessage() << std::endl;
        }
        cleanup();
    }
    
    return 0;
}

{code}

> Exception is thrown when destroying consumer after connection failure
> ---------------------------------------------------------------------
>
>                 Key: AMQCPP-59
>                 URL: https://issues.apache.org/activemq/browse/AMQCPP-59
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>    Affects Versions: 2.0
>            Reporter: Albert Strasheim
>         Assigned To: Nathan Mittler
>             Fix For: 2.0
>
>
> Brought over from AMQCPP-46.
> In a program that reconnects when it detects a connection failure using an 
> exception listener, there seem to be two different places where exceptions 
> can originate.
> In most cases when I shut down the broker and the exception listener fires 
> properly and I can clean up everything (without deletes throwing exceptions), 
> the stack trace that gets printed on the console looks like this:
> {noformat}
> WARNING: activemq::io::SocketInputStream::read - The connection is broken
>         FILE: ..\src\main\activemq\network\SocketInputStream.cpp, LINE: 137
>         FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 199
>         FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 83
>         FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp, 
> LINE: 216
>         FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp, 
> LINE: 120
>         FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp, 
> LINE: 71
>         FILE: ..\src\main\activemq\transport\IOTransport.cpp, LINE: 175
> {noformat}
> The message is printed twice with different tids, from the two threads that 
> are active.
> Sometimes when I shut down the broker and the exception handler fires and I 
> clean up everything but then the consumer's destructor throws an exception. 
> In that case, the stack trace that is printed looks like this:
> {noformat}
> WARNING: activemq::io::SocketInputStream::read - An existing connection was 
> forcibly closed by the remote host.
>         FILE: ..\src\main\activemq\network\SocketInputStream.cpp, LINE: 145
>         FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 199
>         FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 83
>         FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp, 
> LINE: 216
>         FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp, 
> LINE: 120
>         FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp, 
> LINE: 71
>         FILE: ..\src\main\activemq\transport\IOTransport.cpp, LINE: 175
> {noformat}
> Again I see this message from both threads. Note the slightly different line 
> numbers in SocketInputStream.cpp and the slighty different error message 
> (this is on Windows XP SP2). In this case the failure of the socket is 
> probably being detected in a slightly different place.
> If the socket failure happens in the second way, it seems that destructors of 
> consumers (and possibly producers and sessions) don't properly catch the 
> exception when being destroying, causing their destructors to throw an 
> exception, which isn't what we want.

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

Reply via email to