@Override public long getScheduledDeliveryTime() { return ref.getScheduledDeliveryTime(); }
@Override public boolean checkAndSchedule(final MessageReference ref, final boolean tail) { long deliveryTime = ref.getScheduledDeliveryTime(); if (deliveryTime > 0 && scheduledExecutor != null) { if (logger.isTraceEnabled()) { logger.trace("Scheduling delivery for " + ref + " to occur at " + deliveryTime); } addInPlace(deliveryTime, ref, tail); scheduleDelivery(deliveryTime); return true; } return false; }
while (iter.hasNext()) { MessageReference reference = iter.next().getRef(); if (reference.getScheduledDeliveryTime() > now) {
@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 int compare(RefScheduled ref1, RefScheduled ref2) { long diff = ref1.getRef().getScheduledDeliveryTime() - ref2.getRef().getScheduledDeliveryTime(); if (diff < 0L) { return -1; } if (diff > 0L) { return 1; } // Even if ref1 and ref2 have the same delivery time, we only want to return 0 if they are identical if (ref1 == ref2) { return 0; } else { if (ref1.isTail() && !ref2.isTail()) { return 1; } else if (!ref1.isTail() && ref2.isTail()) { return -1; } if (!ref1.isTail() && !ref2.isTail()) { return -1; } else { return 1; } } } }
private void debugList(boolean fail, ScheduledDeliveryHandlerImpl handler, long numberOfExpectedMessages) throws Exception { List<MessageReference> refs = handler.getScheduledReferences(); HashSet<Long> messages = new HashSet<>(); long lastTime = -1; for (MessageReference ref : refs) { assertFalse(messages.contains(ref.getMessage().getMessageID())); messages.add(ref.getMessage().getMessageID()); if (fail) { assertTrue(ref.getScheduledDeliveryTime() >= lastTime); } else { if (ref.getScheduledDeliveryTime() < lastTime) { System.out.println("^^^fail at " + ref.getScheduledDeliveryTime()); } } lastTime = ref.getScheduledDeliveryTime(); } for (long i = 0; i < numberOfExpectedMessages; i++) { assertTrue(messages.contains(Long.valueOf(i))); } }
@Override public void updateScheduledDeliveryTimeTransactional(final long txID, final MessageReference ref) throws Exception { ScheduledDeliveryEncoding encoding = new ScheduledDeliveryEncoding(ref.getScheduledDeliveryTime(), ref.getQueue().getID()); readLock(); try { messageJournal.appendUpdateRecordTransactional(txID, ref.getMessage().getMessageID(), JournalRecordIds.SET_SCHEDULED_DELIVERY_TIME, encoding); } finally { readUnLock(); } }
@Override public void updateScheduledDeliveryTime(final MessageReference ref) throws Exception { ScheduledDeliveryEncoding encoding = new ScheduledDeliveryEncoding(ref.getScheduledDeliveryTime(), ref.getQueue().getID()); readLock(); try { messageJournal.appendUpdateRecord(ref.getMessage().getMessageID(), JournalRecordIds.SET_SCHEDULED_DELIVERY_TIME, encoding, syncNonTransactional, getContext(syncNonTransactional)); } finally { readUnLock(); } }