[
https://issues.apache.org/activemq/browse/AMQCPP-59?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_38024
]
Nathan Mittler commented on AMQCPP-59:
--
Albert,
I think the issue was your main module. It wasn't destroying the resources it
allocated each time through the loop. I've fixed this in the code below. Give
it a try and see if you're still having problems.
{code:title=main.cpp|borderStyle=solid}
#include activemq/core/ActiveMQConnectionFactory.h
#include cms/ExceptionListener.h
#include cms/Session.h
#include iostream
struct ExceptionListener : public cms::ExceptionListener {
bool error;
ExceptionListener() : error(false) {}
virtual ~ExceptionListener(void) {}
virtual void onException( const cms::CMSException ex ) {
std::cout Got an exception in listener: ex.getMessage()
std::endl;
error = true;
}
};
ExceptionListener exListener;
activemq::core::ActiveMQConnectionFactory* connectionFactory = NULL;
cms::Connection* connection = NULL;
cms::Session* session = NULL;
cms::Destination* destination = NULL;
cms::MessageConsumer* consumer = NULL;
void cleanup(){
if( consumer != NULL ){
delete consumer;
consumer = NULL;
}
if( destination != NULL ){
delete destination;
destination = NULL;
}
if( session != NULL ){
delete session;
session = NULL;
}
if( connection != NULL ){
delete connection;
connection = NULL;
}
if( connectionFactory != NULL ){
delete connectionFactory;
connectionFactory = 0;
}
exListener.error = false;
}
int main(int argc, char* argv[]) {
while( true ) {
try {
activemq::core::ActiveMQConnectionFactory* connectionFactory =
new
activemq::core::ActiveMQConnectionFactory(tcp://127.0.0.1:61613);
connection = connectionFactory-createConnection();
connection-setExceptionListener(exListener);
session = connection-createSession( cms::Session::AUTO_ACKNOWLEDGE
);
destination = session-createTopic( TEST.FOO );
consumer = session-createConsumer( destination );
connection-start();
cms::Message* message = consumer-receive(1);
delete message;
message = 0;
cleanup();
} catch ( cms::CMSException ex ) {
std::cout Got an exception: ex.getMessage() std::endl;
}
cleanup();
}
return 0;
}
{code}
Exception is thrown when destroying consumer after connection failure
-
Key: AMQCPP-59
URL: https://issues.apache.org/activemq/browse/AMQCPP-59
Project: ActiveMQ C++ Client
Issue Type: Bug
Affects Versions: 2.0
Reporter: Albert Strasheim
Assigned To: Nathan Mittler
Fix For: 2.0
Brought over from AMQCPP-46.
In a program that reconnects when it detects a connection failure using an
exception listener, there seem to be two different places where exceptions
can originate.
In most cases when I shut down the broker and the exception listener fires
properly and I can clean up everything (without deletes throwing exceptions),
the stack trace that gets printed on the console looks like this:
{noformat}
WARNING: activemq::io::SocketInputStream::read - The connection is broken
FILE: ..\src\main\activemq\network\SocketInputStream.cpp, LINE: 137
FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 199
FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 83
FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp,
LINE: 216
FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp,
LINE: 120
FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp,
LINE: 71
FILE: ..\src\main\activemq\transport\IOTransport.cpp, LINE: 175
{noformat}
The message is printed twice with different tids, from the two threads that
are active.
Sometimes when I shut down the broker and the exception handler fires and I
clean up everything but then the consumer's destructor throws an exception.
In that case, the stack trace that is printed looks like this:
{noformat}
WARNING: activemq::io::SocketInputStream::read - An existing connection was
forcibly closed by the remote host.
FILE: ..\src\main\activemq\network\SocketInputStream.cpp, LINE: 145
FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 199
FILE: ..\src\main\activemq\io\BufferedInputStream.cpp, LINE: 83
FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp,
LINE: 216
FILE: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp,
LINE: 120
FILE: