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.