Package com.rabbitmq.client.impl
Class WorkPool<K,W>
java.lang.Object
com.rabbitmq.client.impl.WorkPool<K,W>
- Type Parameters:
K- Key -- type of clientW- Work -- type of work item
This is a generic implementation of the channels specification
in Channeling Work, Nov 2010 (channels.pdf).
Objects of type K must be registered, with registerKey(K),
and then they become clients and a queue of
items (type W) is stored for each client.
addWorkItem(Object, Object).
If the client is dormant it becomes ready thereby. All other states remain unchanged.
The next ready client, together with a collection of its items,
may be retrieved with nextWorkBlock(collection,max)
(making that client in progress).
An in progress client can finish (processing a batch of items) with finishWorkBlock(K).
It then becomes either dormant or ready, depending if its queue of work items is empty or no.
If a client has items queued, it is either in progress or ready but cannot be both.
When work is finished it may be marked ready if there is further work,
or dormant if there is not.
There is never any work for a dormant client.
A client may be unregistered, with unregisterKey(K), which removes the client from
all parts of the state, and any queue of items stored with it.
All clients may be unregistered with unregisterAllKeys().
Concurrent Semantics
This implementation is thread-safe.-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final BiConsumer<VariableLinkedBlockingQueue<W>, W> The set of clients which have work in progress.private static final intprivate final Map<K, VariableLinkedBlockingQueue<W>> The pool of registered clients, with their work queues.An injective queue of ready clients.Those keys which want limits to be removed. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionbooleanaddWorkItem(K key, W item) Add (enqueue) an item for a specific client.private voiddormantToReady(K key) private intdrainTo(VariableLinkedBlockingQueue<W> deList, Collection<W> c, int maxElements) Private implementation ofdrainTo(not implemented forLinkedList<W>s).booleanfinishWorkBlock(K key) Set client no longer in progress.private voidinProgressToDormant(K key) private voidinProgressToReady(K key) private booleanprivate booleanisInProgress(K key) private booleanprivate booleanisRegistered(K key) voidprivate booleanmoreWorkItems(K key) nextWorkBlock(Collection<W> to, int size) Return the next ready client, and transfer a collection of that client's items to process.private KvoidregisterKey(K key) Add clientkeyto pool of item queues, with an empty queue.private voidsetCapacities(int capacity) voidvoidRemove all clients from pool and from any other state.voidunregisterKey(K key) Remove client from pool and from any other state.
-
Field Details
-
MAX_QUEUE_LENGTH
private static final int MAX_QUEUE_LENGTH- See Also:
-
ready
An injective queue of ready clients. -
inProgress
The set of clients which have work in progress. -
pool
The pool of registered clients, with their work queues. -
unlimited
Those keys which want limits to be removed. We do not limit queue size if this is non-empty. -
enqueueingCallback
-
-
Constructor Details
-
WorkPool
public WorkPool(int queueingTimeout)
-
-
Method Details
-
registerKey
Add clientkeyto pool of item queues, with an empty queue. A client is initially dormant. No-op ifkeyalready present.- Parameters:
key- client to add to pool
-
limit
-
unlimit
-
setCapacities
private void setCapacities(int capacity) -
unregisterKey
Remove client from pool and from any other state. Has no effect if client already absent.- Parameters:
key- of client to unregister
-
unregisterAllKeys
public void unregisterAllKeys()Remove all clients from pool and from any other state. -
nextWorkBlock
Return the next ready client, and transfer a collection of that client's items to process. Mark client in progress. If there is no ready client, returnnull.- Parameters:
to- collection object in which to transfer itemssize- max number of items to transfer- Returns:
- key of client to whom items belong, or
nullif there is none.
-
drainTo
Private implementation ofdrainTo(not implemented forLinkedList<W>s).- Parameters:
deList- to take (poll) elements fromc- to add elements tomaxElements- to take from deList- Returns:
- number of elements actually taken
-
addWorkItem
Add (enqueue) an item for a specific client. No change and returnsfalseif client not registered. If dormant, the client will be marked ready.- Parameters:
key- the client to add to the work item toitem- the work item to add to the client queue- Returns:
trueif and only if the client is marked ready — as a result of this work item
-
finishWorkBlock
Set client no longer in progress. Ignore unknown clients (and returnfalse).- Parameters:
key- client that has finished work- Returns:
trueif and only if client becomes ready- Throws:
IllegalStateException- if registered client not in progress
-
moreWorkItems
-
isInProgress
-
isReady
-
isRegistered
-
isDormant
-
inProgressToReady
-
inProgressToDormant
-
dormantToReady
-
readyToInProgress
-