You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Roger (JIRA)" <ji...@apache.org> on 2007/09/06 15:09:22 UTC

[jira] Commented: (AMQCPP-142) BufferedOutputStream flush called after BufferedOutputStream close resulting in unhandled exceptions

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

Roger commented on AMQCPP-142:
------------------------------

I've just done more investigation on this and the bug report is not quite correct.

The actual problem is specific to openwire - when you attempt to close the session after a transport error ActiveMQSession attempts to close the resource, this in turn attempts to notify the broker which results in another transport exception being raised. So the disposeOf method called from OpenWireConnector::closeResource raises the exception which is handled by deleting the producer info, which attempts to close the resource again, this causes an infinate loop on the stack, which eventually blows.


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