[ https://issues.apache.org/activemq/browse/AMQCPP-46?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_37978 ]
Nathan Mittler commented on AMQCPP-46: -------------------------------------- I found some issues with closing a consumer when there is a broken socket to the broker. Patch has been applied to trunk. I don't have a good environment to test the changes right now ... fancy giving it a whirl? > ActiveMQConnection doesn't propagate exception listener to underlying > connector > ------------------------------------------------------------------------------- > > Key: AMQCPP-46 > URL: https://issues.apache.org/activemq/browse/AMQCPP-46 > Project: ActiveMQ C++ Client > Issue Type: Bug > Affects Versions: 1.1 > Reporter: Albert Strasheim > Assigned To: Nathan Mittler > Fix For: 2.0 > > Attachments: amqconn-exlistener.diff > > > My program is doing the following: > # Create connection using ActiveMQConnectionFactory > # Set a simple exception listener that sets a boolean flag > # Block in receive on consumer > If I then kill the broker, various exceptions happen, but they are never sent > to the exception listener, because the exception listener in StompConnector > is null. It seems to me that ActiveMQConnection should set and get its > exception listener on its underlying connector and probably doesn't have to > contain a pointer to the listener itself. > If I change ActiveMQConnection as in the attached patch to also set the > exception listener on the underlying connector, my exception listener gets > called when the broker dies. > Once I detect the failure, I delete the producer, consumer, session and > connection that failed. Looks like an uncaught exception is getting thrown > during the destruction of the producer (which is the first thing I delete > when cleaning up). The problem here is probably that the connection is trying > to close down a socket that is already broken and something goes awry. I'm > not quite sure how to fix this problem. > Stack trace (with useless bits stripped out): > {noformat} > kernel32.dll!7c812a5b() > [Frames below may be incorrect and/or missing, no symbols loaded for > kernel32.dll] > kernel32.dll!7c812a5b() > > > > myapp.exe!std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int> > > > >::_Ucopy<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int> > > *>(std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int> * > > _First=("..\src\main\activemq\connector\stomp\StompSessionManager.cpp",254), > > > > std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int> * _Last=(<Bad Ptr>,14297048), > > std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int> * > > _Ptr=("..\src\main\activemq\connector\stomp\StompSessionManager.cpp",254)) > > Line 1105 + 0x18 bytes C++ > > myapp.exe!std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > >::operator=(const > std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > > & _Right={...}) Line 582 + 0x1d bytes C++ > 0012b920() > myapp.exe!activemq::core::ActiveMQConsumer::close() Line 84 + 0x34 > bytes C++ > msvcr80d.dll!102418b7() > ... > kernel32.dll!7c812a5b() > > myapp.exe!std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > > >::_Ucopy<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > *>(std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> * _First=(<Bad Ptr>,-17891602), > std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> * _Last=(<Bad Ptr>,-17891602), > std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> * _Ptr=(<Bad Ptr>,1886220148)) Line 1105 + 0x18 bytes C++ > > myapp!std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > >::operator=(const > std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > > & _Right={...}) Line 582 + 0x1d bytes C++ > 0012bf74() > > myapp.exe!activemq::core::ActiveMQSession::onDestroySessionResource(activemq::core::ActiveMQSessionResource > * resource=0x00000001) Line 558 + 0x37 bytes C++ > msvcr80d.dll!10241a10() > ... > kernel32.dll!7c812a5b() > > myapp.exe!std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > > >::_Ucopy<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > *>(std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> * _First=(<Bad Ptr>,1886220148), > std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> * _Last=(<Bad Ptr>,-17891602), > std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> * _Ptr=("<<U",4832632)) Line 1105 + 0x18 bytes C++ > > myapp.exe!std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > >::operator=(const > std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,int> > > & _Right={...}) Line 582 + 0x1d bytes C++ > {noformat} -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.