private void addLifetimeConstraint(final Deletable<? extends Deletable> lifetimeObject) { final Action<Deletable> deleteQueueTask = object -> Subject.doAs(getSubjectWithAddedSystemRights(), (PrivilegedAction<Void>) () -> { AbstractQueue.this.delete(); return null; }); lifetimeObject.addDeleteTask(deleteQueueTask); addDeleteTask(new DeleteDeleteTask(lifetimeObject, deleteQueueTask)); }
@Override public void authorisePublish(final SecurityToken token, final Map<String, Object> arguments) throws AccessControlException { authorise(token, PUBLISH_ACTION, arguments); }
boolean wouldExpire(final ServerMessage message) { long expiration = calculateExpiration(message); return expiration != 0 && expiration <= System.currentTimeMillis(); }
private void checkForNotificationOnNewMessage(final ServerMessage<?> msg) { final Set<NotificationCheck> notificationChecks = getNotificationChecks(); QueueNotificationListener listener = _notificationListener; if (!notificationChecks.isEmpty()) { final long currentTime = System.currentTimeMillis(); final long thresholdTime = currentTime - getAlertRepeatGap(); for (NotificationCheck check : notificationChecks) { if (check.isCheckOnMessageArrival()) { checkForNotification(msg, listener, currentTime, thresholdTime, check); } } } }
Map<String,Object> attributes = getActualAttributes(); arguments.put(Queue.LIFETIME_POLICY, getLifetimePolicy()); case CONNECTION: _exclusiveOwner = session.getAMQPConnection(); addExclusivityConstraint(session.getAMQPConnection()); break; case SESSION: _exclusiveOwner = session; addExclusivityConstraint(session); break; case NONE: if(getLifetimePolicy() == LifetimePolicy.DELETE_ON_CONNECTION_CLOSE) addLifetimeConstraint(session.getAMQPConnection()); + getLifetimePolicy() + " must be created from a connection."); else if(getLifetimePolicy() == LifetimePolicy.DELETE_ON_SESSION_END) addLifetimeConstraint(session); + getLifetimePolicy() + " must be created from a connection."); else if (getLifetimePolicy() == LifetimePolicy.DELETE_ON_CREATING_LINK_CLOSE)
ExistingConsumerPreventsExclusive, QueueDeleted if (isDeleted()) if (hasExclusiveConsumer()) addExclusivityConstraint(session.getAMQPConnection()); addExclusivityConstraint(session); if(getConsumerCount() != 0) if(exclusive && getConsumerCount() != 0) if(filters == null || !filters.startAtTail()) queueContext = new QueueContext(getEntries().getHead()); queueContext = new QueueContext(getEntries().getTail()); childAdded(consumer); consumer.addChangeListener(_deletedChildListener); addChangeListener(new AbstractConfigurationChangeListener()
protected void doEnqueue(final ServerMessage message, final Action<? super MessageInstance> action, MessageEnqueueRecord enqueueRecord) { final QueueEntry entry = getEntries().add(message, enqueueRecord); updateExpiration(entry); try { if (entry.isAvailable()) { checkConsumersNotAheadOfDelivery(entry); notifyConsumers(entry); } checkForNotificationOnNewMessage(entry.getMessage()); } finally { if(action != null) { action.performAction(entry); } RejectPolicyHandler rejectPolicyHandler = _rejectPolicyHandler; if (rejectPolicyHandler != null) { rejectPolicyHandler.postEnqueue(entry); } _postEnqueueOverflowPolicyHandler.checkOverflow(entry); } }
@Override public void checkMessageStatus() QueueEntryIterator queueListIterator = getEntries().iterator(); for(NotificationCheck check : getNotificationChecks()) final long thresholdTime = currentTime - getAlertRepeatGap(); expireEntry(node); checkForNotification(msg, listener, currentTime, thresholdTime, check); checkForNotification(null, listener, currentTime, thresholdTime, check);
QueueEntry node = getNextAvailableEntry(sub); boolean subActive = sub.isActive() && !sub.isSuspended(); && (sub.getPriority() == Integer.MAX_VALUE || noHigherPriorityWithCredit(sub, node))) if (node.isAvailable() && mightAssign(sub, node)) if ((sub.acquires() && !assign(sub, node)) || (!sub.acquires() && (messageReference = node.newMessageReference()) == null)) setLastSeenEntry(sub, node); return new MessageContainer(node, messageReference);
messageContainer = attemptDelivery(consumer); if (hasAvailableMessages()) notifyOtherConsumers(consumer); getNextAvailableEntry(consumer);
private void addExclusivityConstraint(final Deletable<? extends Deletable> lifetimeObject) { final ClearOwnerAction clearOwnerAction = new ClearOwnerAction(lifetimeObject); final DeleteDeleteTask deleteDeleteTask = new DeleteDeleteTask(lifetimeObject, clearOwnerAction); clearOwnerAction.setDeleteTask(deleteDeleteTask); lifetimeObject.addDeleteTask(clearOwnerAction); addDeleteTask(deleteDeleteTask); }
private long calculateExpiration(final ServerMessage message) { long expiration = message.getExpiration(); long arrivalTime = message.getArrivalTime(); if (_minimumMessageTtl != 0L) { if (expiration != 0L) { long calculatedExpiration = calculateExpiration(arrivalTime, _minimumMessageTtl); if (calculatedExpiration > expiration) { expiration = calculatedExpiration; } } } if (_maximumMessageTtl != 0L) { long calculatedExpiration = calculateExpiration(arrivalTime, _maximumMessageTtl); if (expiration == 0L || expiration > calculatedExpiration) { expiration = calculatedExpiration; } } return expiration; }
private void updateExpiration(final QueueEntry entry) { long expiration = calculateExpiration(entry.getMessage()); if (expiration > 0) { entry.setExpiration(expiration); } }