That sounds way better than what I'd proposed. On Fri, Jan 16, 2015 at 9:18 AM, Timothy Bish <tabish...@gmail.com> wrote:
> On 01/15/2015 09:16 PM, artnaseef wrote: > >> How about the following instead? As Tim pointed out, the consumer close >> won't return until no more calls to onMessage are guaranteed. I believe >> that also means it won't return while onMessage() is actively being >> called. >> >> @Tim - can you confirm? >> > > It should be the case that onMessage must always complete prior to close() > returning, unless you do something silly like call close from onMessage. > There are two locks at play here that prevent things from going wrong, one > on the listener and one on the dispatch queue. This is why it is also safe > to just call setMessageListener(null) on the consumer as it will also not > return until no onMessage calls are in progress. During the time there is > no set message listener the messages will pile up in the prefetch queue and > dispatch would start again once a new listener is added. > > > >> If that's correct, the following should do the job effectively: >> >> ON MESSAGE >> LOCK semaphore >> IF shutdown started >> THEN >> ABORT >> END IF >> >> SET processing active >> UNLOCK semaphore >> >> DO process message >> >> LOCK semaphore >> SET processing NOT active >> UNLOCK semaphore >> >> >> ON LISTENER SHUTDOWN >> LOCK semaphore >> SET shutdown started >> UNLOCK semaphore >> >> DO close consumer >> >> SET not done >> WHILE not done >> LOCK semaphore >> IF processing NOT active >> THEN >> SET done >> END IF >> UNLOCK semaphore >> >> IF NOT done >> THEN >> DELAY // short sleep; note there are methods to eliminate the >> sleep >> and use a notification; I don't recall them for C++ right now >> END IF >> END WHILE >> >> DO delete message listener >> >> >> That last part about the delay can be solved with another semaphore as >> well. >> Also, if the part up to "ABORT" in the listener can be done safely even >> after the listener is deleted, then this works even if the consumer close >> can return while the call to onMessage() is still active. >> >> >> >> -- >> View this message in context: http://activemq.2283324.n4. >> nabble.com/how-to-safely-delete-a-cms-MessageListener- >> object-tp4689939p4690003.html >> Sent from the ActiveMQ - User mailing list archive at Nabble.com. >> >> > > -- > Tim Bish > Sr Software Engineer | RedHat Inc. > tim.b...@redhat.com | www.redhat.com > skype: tabish121 | twitter: @tabish121 > blog: http://timbish.blogspot.com/ > >