@Override public int getHighestNotifiedPriority() { final Iterator<QueueConsumerNode> notifiedIterator = new PrioritisedQueueConsumerNodeIterator(_notified); if(notifiedIterator.hasNext()) { final QueueConsumerNode queueConsumerNode = notifiedIterator.next(); return queueConsumerNode.getQueueConsumer().getPriority(); } else { return Integer.MIN_VALUE; } }
private void removeFromAll(final QueueConsumer<?,?> consumer) { final QueueConsumerNode node = consumer.getQueueConsumerNode(); int consumerPriority = consumer.getPriority(); for (int i = 0; i < _allConsumers.size(); ++i) { final PriorityConsumerListPair priorityConsumerListPair = _allConsumers.get(i); if (priorityConsumerListPair._priority == consumerPriority) { priorityConsumerListPair._consumers.removeEntry(node.getAllEntry()); if (priorityConsumerListPair._consumers.isEmpty()) { _allConsumers.remove(i); _notified.remove(i); _interested.remove(i); } return; } else if (priorityConsumerListPair._priority < consumerPriority) { break; } } }
private boolean noHigherPriorityWithCredit(final QueueConsumer<?,?> sub, final QueueEntry queueEntry) { Iterator<QueueConsumer<?,?>> consumerIterator = _queueConsumerManager.getAllIterator(); while (consumerIterator.hasNext()) { QueueConsumer<?,?> consumer = consumerIterator.next(); if(consumer.getPriority() > sub.getPriority()) { if(consumer.isNotifyWorkDesired() && consumer.acquires() && consumer.hasInterest(queueEntry) && getNextAvailableEntry(consumer) != null) { return false; } } else { break; } } return true; }
void setNotifyWorkDesired(final QueueConsumer consumer, final boolean desired) { if (_queueConsumerManager.setInterest(consumer, desired)) { if (desired) { _activeSubscriberCount.incrementAndGet(); notifyConsumer(consumer); } else { _activeSubscriberCount.decrementAndGet(); // iterate over interested and notify one as long as its priority is higher than any notified final Iterator<QueueConsumer<?,?>> consumerIterator = _queueConsumerManager.getInterestedIterator(); final int highestNotifiedPriority = _queueConsumerManager.getHighestNotifiedPriority(); while (consumerIterator.hasNext()) { QueueConsumer<?,?> queueConsumer = consumerIterator.next(); if (queueConsumer.getPriority() < highestNotifiedPriority || notifyConsumer(queueConsumer)) { break; } } } } }
private void addToAll(final QueueConsumerNode consumerNode) { int consumerPriority = consumerNode.getQueueConsumer().getPriority(); int i; for (i = 0; i < _allConsumers.size(); ++i) { final PriorityConsumerListPair priorityConsumerListPair = _allConsumers.get(i); if (priorityConsumerListPair._priority == consumerPriority) { final QueueConsumerNodeListEntry entry = priorityConsumerListPair._consumers.add(consumerNode); consumerNode.setAllEntry(entry); return; } else if (priorityConsumerListPair._priority < consumerPriority) { break; } } PriorityConsumerListPair newPriorityConsumerListPair = new PriorityConsumerListPair(consumerPriority); final QueueConsumerNodeListEntry entry = newPriorityConsumerListPair._consumers.add(consumerNode); consumerNode.setAllEntry(entry); _allConsumers.add(i, newPriorityConsumerListPair); _notified.add(i, new PriorityConsumerListPair(consumerPriority)); _interested.add(i, new PriorityConsumerListPair(consumerPriority)); }
for (PriorityConsumerListPair pair : _interested) if (pair._priority == queueConsumerNode.getQueueConsumer().getPriority()) for (PriorityConsumerListPair pair : _notified) if (pair._priority == queueConsumerNode.getQueueConsumer().getPriority())
&& (sub.getPriority() == Integer.MAX_VALUE || noHigherPriorityWithCredit(sub, node)))