Gary,

I'm not quite able to cause this to happen in a simple test case. Perhaps
this is to do with some 
thread timing/scheduling issues in the simple test case vs our application.
However, are you in a
position to explain what the deliveredMessage collection is used for? Is it
not used in all connection/
ack modes? Perhaps if I knew what the behaviour should be like, I'd be able
to construct a test
case that simulate our environment.

Cheers,

Bonny


Gary Tully wrote:
> 
> Hi Bonny,
> that looks like a bug indeed, should be easy to replicate in a Junit
> tests case I think. Could you raise a jira issue for this and if you
> have some tests code that demonstrates, please include it.
> 
> for more info see: http://activemq.apache.org/contributing.html
> 
> Thanks,
> Gary.
> 
> 2009/2/6 bonnyr <bon...@optusnet.com.au>:
>>
>> AMQ 5.1 (but problem exists in the sources of AMQ-5.2 as of today)
>>
>> My setup:
>> * Broker is configured with a single queue, full with messages, on a host
>> accessible via the network.
>> * Application configured with a single consumer, connected to a single
>> sesssion, running in its own thread.
>> * ActiveMQ delivers lots of messages using one of the ActiveMQSessionTask
>> threads.
>> * Session configured as CLIENT_ACKNOLEDGE
>>
>>
>> Since the queue is full of messages, delivery of these messages happen as
>> fast as the network
>> can deliver and the AMQ thread is invoking the onMessage with each new
>> message. These messages
>> are then processed by the consumer thread. The consumer thread then
>> decides
>> to close the connection
>> and the following ensues:
>> [code]
>> java.util.ConcurrentModificationException
>>        at
>> java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:617)
>>        at java.util.LinkedList$ListItr.next(LinkedList.java:552)
>>        at
>> org.apache.activemq.ActiveMQMessageConsumer.dispose(ActiveMQMessageConsumer.java:663)
>>        at
>> org.apache.activemq.ActiveMQMessageConsumer.close(ActiveMQMessageConsumer.java:583)
>>        at
>> com.xxx.app..AMsgQueueConsumer.doClose(AMsgQueueConsumer.java:351)
>>        at com.xxx.app.AMsgQueueConsumer.suspend
>>
>>        ... snip ...
>>
>> [/code]
>>
>> This happens because AMQ is busy delivering messages and there is a
>> collection [b]deliveredMessages[/b] that is
>> not protected by synchronisation in exactly one place (everywhere else it
>> is...) which is executing the
>> following code (in the dispose method):
>> [code]
>>  ... snip ...
>>            if (session.isClientAcknowledge()) {
>>                if (!this.info.isBrowser()) {
>>                    // rollback duplicates that aren't acknowledged
>>                    for (MessageDispatch old : deliveredMessages) {
>>                        session.connection.rollbackDuplicate(this,
>> old.getMessage());
>>                    }
>>                }
>>            }
>>  ... snip ...
>> [/code]
>>
>> Since the code iterates over the collection, and the iterator checks for
>> modifications to the underlying collection, and since the AMQ message
>> delivery thread has managed to sneak in a couple more messages
>> while the consumer thread attempted to close the connection, the problem
>> occurs (it could be that
>> the for syntax hides the explicit iterator calls, but...)
>>
>>
>> Is this an ommission or is there a reason for not synchronising access to
>> this collection? If it's not a bug
>> then how should the consumer be disconnected?
>>
>> Cheers,
>>
>> Bonny
>> --
>> View this message in context:
>> http://www.nabble.com/ConcurrentModificationException-while-closing-consumer-tp21867250p21867250.html
>> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>>
>>
> 
> 
> 
> -- 
> http://blog.garytully.com
> 
> Open Source SOA
> http://FUSESource.com
> 
> 

-- 
View this message in context: 
http://www.nabble.com/ConcurrentModificationException-while-closing-consumer-tp21867250p21907669.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to