[ 
https://issues.apache.org/activemq/browse/AMQCPP-46?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_37987
 ] 

Albert Strasheim commented on AMQCPP-46:
----------------------------------------

I realise that C++ isn't Java but it seems that close and the destructor have 
different responsibilities. Closing a consumer prevents it from receiving any 
more messages. Closing a session prevents all its consumers from receiving any 
more messages. Closing a connection prevents all its sessions from receiving 
any more messages. Deleting consumers, sessions and connections (in that 
order), free the resources allocated for these objects.

Are there data structures inside a session that can only be deleted by close 
(i.e. can't be left over until the destructor is called)?

I'm asking about these issues with a view to the Python wrappers I'm working 
on. Boost.Python makes it very easy to control object lifetimes (e.g. keeping a 
reference to a session as long as any consumers made from it are still 
referenced), but it becomes a lot harder to enforce close order with the 
library as it is currently. If close on a session must delete stuff that 
invalidates consumers made from it, it would be very useful if the consumers 
could at least throw an IllegalStateException when you try to close them 
instead of crashing randomly.

Thanks again.

> 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
>
>
> 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.

Reply via email to