[
https://issues.apache.org/activemq/browse/AMQCPP-142?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Nathan Mittler reassigned AMQCPP-142:
-------------------------------------
Assignee: Nathan Mittler (was: Timothy Bish)
> 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.