DatabaseVisitor queueVisitor = new DatabaseVisitor()
{
public void visit(DatabaseEntry key, DatabaseEntry value) throws AMQStoreException
{
QueueRecord queueRec = (QueueRecord) queueTupleBinding.entryToObject(value);
AMQShortString queueName = queueRec.getNameShortString();
//if the queue name is in the gathered list then set its exclusivity true
if (durableSubQueues.contains(queueName))
{
_logger.info("Marking as possible DurableSubscription backing queue: " + queueName);
queueRec.setExclusive(true);
}
//The simple call to createQueue with the QueueRecord object is sufficient for a v2->v3 upgrade as
//the extra 'exclusive' property in v3 will be defaulted to false in the record creation.
_newMessageStore.createQueue(queueRec);
_count++;
existingQueues.add(queueName);
}
};
_oldMessageStore.visitQueues(queueVisitor);
logCount(queueVisitor.getVisitedCount(), "Queue");
// Look for persistent messages stored for non-durable queues
_logger.info("Checking for messages previously sent to non-durable queues");
// track all message delivery to existing queues
final HashSet<Long> queueMessages = new HashSet<Long>();
// hold all non existing queues and their messages IDs
final HashMap<String, HashSet<Long>> phantomMessageQueues = new HashMap<String, HashSet<Long>>();
// delivery DB visitor to check message delivery and identify non existing queues
final QueueEntryTB queueEntryTB = new QueueEntryTB();
DatabaseVisitor messageDeliveryCheckVisitor = new DatabaseVisitor()
{
public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
{
QueueEntryKey entryKey = (QueueEntryKey) queueEntryTB.entryToObject(key);
Long messageId = entryKey.getMessageId();
AMQShortString queueName = entryKey.getQueueName();
if (!existingQueues.contains(queueName))
{
String name = queueName.asString();
HashSet<Long> messages = phantomMessageQueues.get(name);
if (messages == null)
{
messages = new HashSet<Long>();
phantomMessageQueues.put(name, messages);
}
messages.add(messageId);
_count++;
}
else
{
queueMessages.add(messageId);
}
}
};
_oldMessageStore.visitDelivery(messageDeliveryCheckVisitor);
if (phantomMessageQueues.isEmpty())
{
_logger.info("No such messages were found");
}
else
{
_logger.info("Found " + messageDeliveryCheckVisitor.getVisitedCount()+ " such messages in total");
for (Entry<String, HashSet<Long>> phantomQueue : phantomMessageQueues.entrySet())
{
String queueName = phantomQueue.getKey();
HashSet<Long> messages = phantomQueue.getValue();
_logger.info(MessageFormat.format("There are {0} messages which were previously delivered to non-durable queue ''{1}''",messages.size(), queueName));
boolean createQueue;
if(!_interactive)
{
createQueue = true;
_logger.info("Running in batch-mode, marking queue as durable to ensure retention of the messages.");
}
else
{
createQueue = userInteract("Do you want to make this queue durable?\n"
+ "NOTE: Answering No will result in these messages being discarded!");
}
if (createQueue)
{
for (Long messageId : messages)
{
queueMessages.add(messageId);
}
AMQShortString name = new AMQShortString(queueName);
existingQueues.add(name);
QueueRecord record = new QueueRecord(name, null, false, null);
_newMessageStore.createQueue(record);
}
}
}