[
https://issues.apache.org/activemq/browse/AMQCPP-46?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_38005
]
Albert Strasheim commented on AMQCPP-46:
----------------------------------------
I noticed the following issue. Don't know if it qualifies as an issue in
AMQCPP, but I thought I'd mention it.
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 forc
ibly 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: ..\src\main\activemq\connector\stomp\StompCommandReader.cpp,
LINE: 71
FILE: ..\src\main\activemq\transport\IOTransport.cpp, LINE: 175
{noformat}
Again I see this message from both threads. Note the slightly different line
numbers in SocketInputStream.cpp. In this case the failure of the socket is
probably being detected in a slightly different place.
Should consumers' (and producers' and sessions') destructors be excepted to
throw if the underlying connection is broken or did you intend to catch all
these exceptions?
For now, I'll wrap cleanup of all my producers, consumers and sessions in a
function that ignores any CMS exceptions.
> 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, main.cpp, purify-example.txt
>
>
> 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.