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

Timothy Bish commented on AMQCPP-142:
-------------------------------------

Committed a small change in SVN 583934 which I think may resolve this.  I 
modified the OpenwireConnector so that it would not try to use a transport 
after an exception occurred.

> 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: Openwire
>    Affects Versions: 2.1
>         Environment: WinXP Pro SP2
>            Reporter: Roger
>            Assignee: Nathan Mittler
>             Fix For: 2.1.1
>
>
> 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