BufferedOutputStream flush called after BufferedOutputStream close resulting in 
unhandled exceptions
----------------------------------------------------------------------------------------------------

                 Key: AMQCPP-142
                 URL: https://issues.apache.org/activemq/browse/AMQCPP-142
             Project: ActiveMQ C++ Client
          Issue Type: Bug
          Components: CMS Impl
    Affects Versions: 2.1
         Environment: WinXP Pro SP2
            Reporter: Roger
            Assignee: Nathan Mittler


After comms have been broken (shutting down the broker is an easy way to 
reproduce...) and the producer attempts to send a message a Transport IO 
exception is raised but after this point the session cannot be cleanly closed. 
The sessions closed flag indicates it is not already closed. The problem seems 
to be mainly in the BufferedOutputStream - this objects "close" method is 
called but after this the same objects "flush" method is called resulting in 
exceptions (attempts to access deleted memory). I'm presuming it is attempting 
to send cached data after the stream has been closed.

This is ActiveMQ-CPP 2.1, using Broker version 5.0:-
http://people.apache.org/repo/m2-snapshot-repository/org/apache/activemq/apache-activemq/5.0-SNAPSHOT/apache-activemq-5.0-20070904.133257-1.zip

The following is an example snippet of code which demonstrates this problem:

static Connection* connection = NULL;
static Session* session = NULL;
static Destination* destination = NULL;
static MessageProducer* producer = NULL;

static const std::string brokerURI = 
"tcp://127.0.0.1:61616?wireFormat=openwire&transport.useAsyncSend=true&connectionTimeout=5000&soTimeout=1000";

bool initialise()
{
        bool result = false;

        try {
                ActiveMQConnectionFactory* connectionFactory = new 
ActiveMQConnectionFactory( brokerURI );

                // Create a Connection
                connection = connectionFactory->createConnection();
                connection->start();

                delete connectionFactory;

                // Create a Session
                session = connection->createSession( Session::AUTO_ACKNOWLEDGE 
);

                // Create the destination
                destination = session->createQueue( "BARNEY" );

                // Create a MessageProducer from the Session to the Queue
                producer = session->createProducer( destination );
                producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT);

                result = true;
        }
        catch (activemq::exceptions::ActiveMQException& e) {
                e.printStackTrace();
        }

        return result;
}


bool sendMessage(string msg)
{
        bool result = false;

    try {
            TextMessage* message = session->createTextMessage( msg );

             producer->send( message );
             delete message;
               
             result = true;
        }
        catch (activemq::exceptions::ActiveMQException& e) { // <------<<<< 
catches the exception after the broker has been shutdown (transport is closed)
                // Close open resources.
                try{
                        if( session != NULL ){
                                session->close();  // <--------<<<< Causes 
unhandled exceptions
                        }
            // close connection...
                        // free everything else...
                }
        }

        return result;
}

void main()
{
        if (initialise()){
                while (1){
                        // do things to create the data to send...

                        // send data
                        sendMessage("fred");

                         // sleep for a bit....

                         // <<<< KILL THE BROKER SOMETIME DURING THIS LOOP >>>>
                }

                // clean up .....
        }
} 

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