//Migrate _messageMetaDataDb;
_logger.info("Message MetaData");
final Database newMetaDataDB = _newMessageStore.getMetaDataDb();
final TupleBinding<Object> oldMetaDataTupleBinding = _oldMessageStore.getMetaDataTupleBindingFactory().getInstance();
final TupleBinding<Object> newMetaDataTupleBinding = _newMessageStore.getMetaDataTupleBindingFactory().getInstance();
DatabaseVisitor metaDataVisitor = new DatabaseVisitor()
{
public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
{
_count++;
MessageMetaData metaData = (MessageMetaData) oldMetaDataTupleBinding.entryToObject(value);
// get message id
Long messageId = TupleBinding.getPrimitiveBinding(Long.class).entryToObject(key);
// ONLY copy data if message is delivered to existing queue
if (!queueMessages.contains(messageId))
{
return;
}
DatabaseEntry newValue = new DatabaseEntry();
newMetaDataTupleBinding.objectToEntry(metaData, newValue);
newMetaDataDB.put(null, key, newValue);
}
};
_oldMessageStore.visitMetaDataDb(metaDataVisitor);
logCount(metaDataVisitor.getVisitedCount(), "Message MetaData");
//Migrate _messageContentDb;
_logger.info("Message Contents");
final Database newContentDB = _newMessageStore.getContentDb();
final TupleBinding<MessageContentKey> oldContentKeyTupleBinding = new MessageContentKeyTB_4();
final TupleBinding<MessageContentKey> newContentKeyTupleBinding = new MessageContentKeyTB_5();
final TupleBinding contentTB = new ContentTB();
DatabaseVisitor contentVisitor = new DatabaseVisitor()
{
long _prevMsgId = -1; //Initialise to invalid value
int _bytesSeenSoFar = 0;
public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
{
_count++;
//determine the msgId of the current entry
MessageContentKey_4 contentKey = (MessageContentKey_4) oldContentKeyTupleBinding.entryToObject(key);
long msgId = contentKey.getMessageId();
// ONLY copy data if message is delivered to existing queue
if (!queueMessages.contains(msgId))
{
return;
}
//if this is a new message, restart the byte offset count.
if(_prevMsgId != msgId)
{
_bytesSeenSoFar = 0;
}
//determine the content size
ByteBuffer content = (ByteBuffer) contentTB.entryToObject(value);
int contentSize = content.limit();
//create the new key: id + previously seen data count
MessageContentKey_5 newKey = new MessageContentKey_5(msgId, _bytesSeenSoFar);
DatabaseEntry newKeyEntry = new DatabaseEntry();
newContentKeyTupleBinding.objectToEntry(newKey, newKeyEntry);
DatabaseEntry newValueEntry = new DatabaseEntry();
contentTB.objectToEntry(content, newValueEntry);
newContentDB.put(null, newKeyEntry, newValueEntry);
_prevMsgId = msgId;
_bytesSeenSoFar += contentSize;
}
};
_oldMessageStore.visitContentDb(contentVisitor);
logCount(contentVisitor.getVisitedCount(), "Message Content");
//Migrate _deliveryDb;
_logger.info("Delivery Records");
final Database deliveryDb =_newMessageStore.getDeliveryDb();
DatabaseVisitor deliveryDbVisitor = new DatabaseVisitor()
{
public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
{
_count++;
// get message id from entry key
QueueEntryKey entryKey = (QueueEntryKey) queueEntryTB.entryToObject(key);
AMQShortString queueName = entryKey.getQueueName();
// ONLY copy data if message queue exists
if (existingQueues.contains(queueName))
{
deliveryDb.put(null, key, value);
}
}
};
_oldMessageStore.visitDelivery(deliveryDbVisitor);
logCount(contentVisitor.getVisitedCount(), "Delivery Record");