void postRollback(final LinkedList<MessageReference> refs) { //if we have purged then ignore adding the messages back if (purgeOnNoConsumers && getConsumerCount() == 0) { purgeAfterRollback(refs); return; } addHead(refs, false); }
@Override public void run() { if (first) { queue.addHead(messageReference, false); } else { queue.addTail(messageReference); } added = true; countDownLatch.countDown(); } }
/** This will print errors and decide what to do with the errored consumer from the protocol layer. */ @Override public void errorProcessing(Consumer consumer, Throwable t, MessageReference reference) { synchronized (this) { ActiveMQServerLogger.LOGGER.removingBadConsumer(t, consumer, reference); // If the consumer throws an exception we remove the consumer try { removeConsumer(consumer); } catch (Exception e) { ActiveMQServerLogger.LOGGER.errorRemovingConsumer(e); } // The message failed to be delivered, hence we try again addHead(reference, false); } }
@Override public void deliverScheduledMessages() throws ActiveMQException { List<MessageReference> scheduledMessages = scheduledDeliveryHandler.cancel(null); if (scheduledMessages != null && scheduledMessages.size() > 0) { for (MessageReference ref : scheduledMessages) { ref.getMessage().setScheduledDeliveryTime(ref.getScheduledDeliveryTime()); ref.setScheduledDeliveryTime(0); } this.addHead(scheduledMessages, true); } }
@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); } }
@Override public void addHead(final List<MessageReference> refs, boolean scheduling) { enterCritical(CRITICAL_PATH_ADD_HEAD); synchronized (this) { try { for (MessageReference ref : refs) { addHead(ref, scheduling); } resetAllIterators(); deliverAsync(); } finally { leaveCritical(CRITICAL_PATH_ADD_HEAD); } } }
@Test public void testGetReference() throws Exception { QueueImpl queue = getTemporaryQueue(); MessageReference messageReference = generateReference(queue, 1); MessageReference messageReference2 = generateReference(queue, 2); MessageReference messageReference3 = generateReference(queue, 3); queue.addHead(messageReference, false); queue.addHead(messageReference2, false); queue.addHead(messageReference3, false); Assert.assertEquals(queue.getReference(2), messageReference2); }
@Test public void testGetNonExistentReference() throws Exception { QueueImpl queue = getTemporaryQueue(); MessageReference messageReference = generateReference(queue, 1); MessageReference messageReference2 = generateReference(queue, 2); MessageReference messageReference3 = generateReference(queue, 3); queue.addHead(messageReference, false); queue.addHead(messageReference2, false); queue.addHead(messageReference3, false); Assert.assertNull(queue.getReference(5)); }
queue.addHead(ref, false);
@Test public void testMessageOrder() throws Exception { FakeConsumer consumer = new FakeConsumer(); QueueImpl queue = getTemporaryQueue(); MessageReference messageReference = generateReference(queue, 1); MessageReference messageReference2 = generateReference(queue, 2); MessageReference messageReference3 = generateReference(queue, 3); queue.addHead(messageReference, false); queue.addTail(messageReference2); queue.addHead(messageReference3, false); Assert.assertEquals(0, consumer.getReferences().size()); queue.addConsumer(consumer); queue.deliverNow(); Assert.assertEquals(3, consumer.getReferences().size()); Assert.assertEquals(messageReference3, consumer.getReferences().get(0)); Assert.assertEquals(messageReference, consumer.getReferences().get(1)); Assert.assertEquals(messageReference2, consumer.getReferences().get(2)); }