@Override public void acknowledge(final MessageReference ref) throws Exception { acknowledge(ref, null); }
@Override public void acknowledge(final Transaction tx, final MessageReference ref) throws Exception { acknowledge(tx, ref, AckReason.NORMAL, null); }
@Override public void acknowledge(final MessageReference ref, final ServerConsumer consumer) throws Exception { acknowledge(ref, AckReason.NORMAL, consumer); }
@Override public void actMessage(Transaction tx, MessageReference ref, boolean fromMessageReferences) throws Exception { incDelivering(ref); acknowledge(tx, ref, ackReason, null); if (fromMessageReferences) { refRemoved(ref); } } };
private void purgeAfterRollback(LinkedList<MessageReference> refs) { try { Transaction transaction = new TransactionImpl(storageManager); for (MessageReference reference : refs) { incDelivering(reference); // post ack will decrement this, so need to inc acknowledge(transaction, reference, AckReason.KILLED, null); } transaction.commit(); } catch (Exception e) { logger.warn(e.getMessage(), e); } }
@Override public void acknowledge(final MessageReference ref, final AckReason reason, final ServerConsumer consumer) throws Exception { if (isNonDestructive() && reason == AckReason.EXPIRED || reason == AckReason.KILLED ) { removeIfCurrent(ref); } super.acknowledge(ref, reason, consumer); }
private void move(final SimpleString toAddress, final Transaction tx, final MessageReference ref, final boolean expiry, final boolean rejectDuplicate, final long... queueIDs) throws Exception { Message copyMessage = makeCopy(ref, expiry); copyMessage.setAddress(toAddress); if (queueIDs != null && queueIDs.length > 0) { ByteBuffer buffer = ByteBuffer.allocate(8 * queueIDs.length); for (long id : queueIDs) { buffer.putLong(id); } copyMessage.putBytesProperty(Message.HDR_ROUTE_TO_IDS.toString(), buffer.array()); } postOffice.route(copyMessage, tx, false, rejectDuplicate); if (expiry) { acknowledge(tx, ref, AckReason.EXPIRED, null); } else { acknowledge(tx, ref); } }
private void expire(final Transaction tx, final MessageReference ref) throws Exception { SimpleString expiryAddress = addressSettingsRepository.getMatch(address.toString()).getExpiryAddress(); if (expiryAddress != null) { Bindings bindingList = postOffice.lookupBindingsForAddress(expiryAddress); if (bindingList == null || bindingList.getBindings().isEmpty()) { ActiveMQServerLogger.LOGGER.errorExpiringReferencesNoBindings(expiryAddress); acknowledge(tx, ref, AckReason.EXPIRED, null); } else { move(expiryAddress, tx, ref, true, true); } } else { if (!printErrorExpiring) { printErrorExpiring = true; // print this only once ActiveMQServerLogger.LOGGER.errorExpiringReferencesNoQueue(name); } acknowledge(tx, ref, AckReason.EXPIRED, null); } }
@Override public void expire(final MessageReference ref, final ServerConsumer consumer) throws Exception { SimpleString messageExpiryAddress = expiryAddressFromMessageAddress(ref); if (messageExpiryAddress == null) { messageExpiryAddress = expiryAddressFromAddressSettings(ref); } if (messageExpiryAddress != null) { if (logger.isTraceEnabled()) { logger.trace("moving expired reference " + ref + " to address = " + messageExpiryAddress + " from queue=" + this.getName()); } move(null, messageExpiryAddress, null, ref, false, AckReason.EXPIRED, consumer); } else { if (logger.isTraceEnabled()) { logger.trace("expiry is null, just acking expired message for reference " + ref + " from queue=" + this.getName()); } acknowledge(ref, AckReason.EXPIRED, consumer); } if (server != null && server.hasBrokerMessagePlugins()) { final SimpleString expiryAddress = messageExpiryAddress; server.callBrokerMessagePlugins(plugin -> plugin.messageExpired(ref, expiryAddress, consumer)); } }
@Override public synchronized void addHead(final MessageReference ref, boolean scheduling) { SimpleString lastValueProp = ref.getLastValueProperty(); if (lastValueProp != null) { HolderReference hr = map.get(lastValueProp); if (hr != null) { if (scheduling) { // We need to overwrite the old ref with the new one and ack the old one replaceLVQMessage(ref, hr); } else { // We keep the current ref and ack the one we are returning super.referenceHandled(ref); try { super.acknowledge(ref); } catch (Exception e) { ActiveMQServerLogger.LOGGER.errorAckingOldReference(e); } } } else { hr = new HolderReference(lastValueProp, ref); map.put(lastValueProp, hr); super.addHead(hr, scheduling); } } else { super.addHead(ref, scheduling); } }
class ExpiryScanner implements Runnable { public AtomicInteger scannerRunning = new AtomicInteger(0); @Override public void run() { boolean expired = false; boolean hasElements = false; int elementsExpired = 0; LinkedList<MessageReference> expiredMessages = new LinkedList<>(); synchronized (QueueImpl.this) { if (queueDestroyed) { return; } if (logger.isDebugEnabled()) { logger.debug("Scanning for expires on " + QueueImpl.this.getName()); } LinkedListIterator<MessageReference> iter = iterator(); try { while (postOffice.isStarted() && iter.hasNext()) { hasElements = true; MessageReference ref = iter.next(); if (ref.getMessage().isExpired()) { incDelivering(ref); expired = true; expiredMessages.add(ref);
@Override public void actMessage(Transaction tx, MessageReference ref) throws Exception { boolean ignored = false; incDelivering(ref); if (rejectDuplicates) { byte[] duplicateBytes = ref.getMessage().getDuplicateIDBytes(); if (duplicateBytes != null) { if (targetDuplicateCache.contains(duplicateBytes)) { ActiveMQServerLogger.LOGGER.messageWithDuplicateID(ref.getMessage().getDuplicateProperty(), toAddress, address, address); acknowledge(tx, ref); ignored = true; } } } if (!ignored) { move(null, toAddress, binding, ref, rejectDuplicates, AckReason.NORMAL, null); refRemoved(ref); //move(toAddress, tx, ref, false, rejectDuplicates); } } });
@Override public synchronized boolean deleteReference(final long messageID) throws Exception { boolean deleted = false; Transaction tx = new TransactionImpl(storageManager); try (LinkedListIterator<MessageReference> iter = iterator()) { while (iter.hasNext()) { MessageReference ref = iter.next(); if (ref.getMessage().getMessageID() == messageID) { incDelivering(ref); acknowledge(tx, ref); iter.remove(); refRemoved(ref); deleted = true; break; } } if (!deleted) { // Look in scheduled deliveries deleted = scheduledDeliveryHandler.removeReferenceWithID(messageID) != null ? true : false; } tx.commit(); return deleted; } }
queue.acknowledge(ref); queue.acknowledge(ref); queue.acknowledge(ref); queue.acknowledge(ref);
queue.acknowledge(ref2);
queue.acknowledge(ref5); queue.acknowledge(ref6);