[concurrency-interest] PriorityBlockingQueue question

David Walend david at walend.net
Wed Sep 27 08:59:05 EDT 2006



Begin forwarded message:

> From: David Walend <david at walend.net>
> Date: September 27, 2006 8:57:56 AM EDT
> To: Tim Peierls <tim at peierls.net>
> Subject: Re: [concurrency-interest] PriorityBlockingQueue question
>
> On Sep 26, 2006, at 11:11 AM, Tim Peierls wrote:
>
>> On 9/26/06, Tim Peierls <tim at peierls.net> wrote:
>> No ideas for this -- I'm thinking about the other approach.
>>
>> What if you maintained a separate queue for each selector and  
>> atomically marked messages when consumed? (You could use  
>> AtomicMarkableReference.attemptMark, for example.) Then you don't  
>> have the problem of having to remove a message from all other  
>> queues, since receivers can simply ignore messages that someone  
>> else marked.
>>
>> Then take(selector) is just "take from queue associated with  
>> selector" -- more precisely, repeatedly take until you can  
>> atomically mark an unmarked message. I think you could use PBQs  
>> instead of PQs and a ConcurrentMap from selector to queue,  
>> avoiding the need for a global lock.
>
> Thanks, Tim. That sounds much better. I wouldn't (and didn't) find  
> AtomicMarkableReference on my own. Also, everything that can have a  
> message selector also has a close() method that I can use to drop  
> the PBQs when nothing is listening.
>
> I like the approach. It promises to be very lively, but will make a  
> lot of AtomicMarkableReferences to GC.
>
>> Not sure of the desired behavior for messages that don't match any  
>> currently waiting selector. Are they discarded? Left in their own  
>> queue for selector-less consumption? Or do they have to be scanned  
>> for matches each time you hear about a new selector? (In which  
>> case it might seem as though you're almost back to the other  
>> approach, but maybe without the need for a global lock.)
>
> That one is pretty straight forward; the Channel has to have a king  
> PBQ that represents the JMS Queue's contents (for QueueBrowsers if  
> nothing else). When something adds a new message selector, the  
> Channel will have to get a copy of that PBQ's contents into the new  
> message selector queue. Then it should be off and running. It's OK  
> if up a new QueueReceiver is relatively heavy.
>
> Thanks again for the help. I hope to code it up over the weekend.
>
> Dave
>
> David Walend
> david at walend.net
>
>

David Walend
david at walend.net




More information about the Concurrency-interest mailing list