if (usePrefetch) {
return getMessagesWithPrefetch();
}
List tmpList = new ArrayList();
synchronized (lock) {
QueueListEntry entry = messagePtrs.getFirstEntry();
while (entry != null) {
MessagePointer pointer = (MessagePointer) entry.getElement();
if (!pointer.isDispatched()) {
ActiveMQMessage msg = pointer.getContainer().getMessage(pointer.getMessageIdentity());
if (msg != null) {
if (pointer.isDispatched() || pointer.isRedelivered()) {
//already dispatched - so mark as redelivered
msg.setJMSRedelivered(true);
if (redeliveryPolicy.isBackOffMode()
&& msg.getDeliveryCount() < redeliveryPolicy.getMaximumRetryCount()) {
long sleepTime = redeliveryPolicy.getInitialRedeliveryTimeout();
sleepTime *= (msg.getDeliveryCount() * redeliveryPolicy.getBackOffIncreaseRate());
try {
Thread.sleep(sleepTime);
}
catch (InterruptedException e) {
}
}
//incremenent delivery count
msg.incrementDeliveryCount();
}
if (!pointer.getContainer().isDeadLetterQueue()
&& (msg.isExpired() || msg.getDeliveryCount() >= redeliveryPolicy
.getMaximumRetryCount())) {
if (msg.isExpired()) {
log.warn("Message: " + msg + " has expired");
}
else {
log.warn("Message: " + msg + " exceeded retry count: " + msg.getDeliveryCount());
}
deadLetterPolicy.sendToDeadLetter(msg);
QueueListEntry discarded = entry;
entry = messagePtrs.getPrevEntry(discarded);
messagePtrs.remove(discarded);
}
else {
pointer.setDispatched(true);
msg.setDispatchedFromDLQ(pointer.getContainer().isDeadLetterQueue());
tmpList.add(msg);
}
}
else {
//the message is probably expired
log.info("Message probably expired: " + msg);
QueueListEntry discarded = entry;
entry = messagePtrs.getPrevEntry(discarded);
messagePtrs.remove(discarded);
if (msg != null) {
deadLetterPolicy.sendToDeadLetter(msg);
}