Michal Zerola created QPID-4779:
-----------------------------------

             Summary: Implementation of policies for queues in Java Qpid Broker
                 Key: QPID-4779
                 URL: https://issues.apache.org/jira/browse/QPID-4779
             Project: Qpid
          Issue Type: Improvement
          Components: Java Broker
    Affects Versions: Future
            Reporter: Michal Zerola
            Priority: Minor
             Fix For: Future


Hi,

currently the Java Broker doesn't provide the same policies for queues like C++ 
Broker does. In particular, there is no option to hard limit the maximum number 
of messages for queue and instruct the broker to act according to some policy 
if there is an attempt to exceed this limit.

I think it would be nice to have possibility to set queue to REJECT or 
RING-TYPE policy like in C++ version.

In the attachment is a dirty-prototype using which I am trying to outline the 
main idea of possible implementation. Please, consider it is as an illustration 
of the principle, there is definitely more (technical) work needed (including 
tests).

Some explanation along the way:
REJECT policy:
The idea should be quite straight-forward. If the new message is supposed to be 
enqueued on some queue which current depth is already at the limit, the message 
should be rejected.

RING policy:
Each queue should be able to delete the least important message and create the 
free slot for new incoming message if the limit is met. The definition of least 
important differs among the queue types. For standard queue, it should be the 
oldest message, which can be easily found at the head of the queue. For 
priority queues (inspired by C++ implementation) it should be the oldest 
message with the lowest priority. For sorted queues I leave this up to 
discussion. Personally, I would assume that oldest message is the least 
important.

NONE policy:
Current situation, the queue grows until JVM memory limits allow it.

As you can see from the patch, I have added the decision what to do with the 
message into the postCommit() method of PostEnqueueAction. According to the 
policy type, the new message is either rejected (AMQException thrown) or 
enqueued. In the case of RING policy, the least important message is deleted.

I have added the method deleteLowestPriorityEntry() into the AMQQueue. The 
implementation in SimpleAMQQueue illustrates the idea - try to acquire and 
delete the least priority entry. To find the lowest priority entry from the 
entry list I have added the new iterator into the QueueEntryList interface. 
Each implementation can have different way how to find such an entry. 
SimpleAMQQueueEntryList just takes the first (oldest one). PriorityQueueList 
starts with the oldest with the lowest priority entry. I have not implemented 
yet the version for Sorted queues.

Please try to look into the patch and let me know if the implementation based 
on this idea would be reasonable. I will provide the enhanced version of the 
patch then.

Thank you.

Michal

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to