List<RecordInfo> records = new LinkedList<RecordInfo>();
// We load these, but don't use them.
List<PreparedTransactionInfo> preparedTransactions = new LinkedList<PreparedTransactionInfo>();
Journal messageJournal = storageManager.getMessageJournal();
HornetQServerLogger.LOGGER.debug("Reading journal from " + config.getJournalDirectory());
messageJournal.start();
// Just logging these, no action necessary
TransactionFailureCallback transactionFailureCallback = new TransactionFailureCallback()
{
@Override
public void failedTransaction(long transactionID, List<RecordInfo> records1, List<RecordInfo> recordsToDelete)
{
StringBuilder message = new StringBuilder();
message.append("Encountered failed journal transaction: " + transactionID);
for (int i = 0; i < records1.size(); i++)
{
if (i == 0)
{
message.append("; Records: ");
}
message.append(records1.get(i));
if (i != (records1.size() - 1))
{
message.append(", ");
}
}
for (int i = 0; i < recordsToDelete.size(); i++)
{
if (i == 0)
{
message.append("; RecordsToDelete: ");
}
message.append(recordsToDelete.get(i));
if (i != (recordsToDelete.size() - 1))
{
message.append(", ");
}
}
HornetQServerLogger.LOGGER.debug(message.toString());
}
};
((JournalImpl) messageJournal).load(records, preparedTransactions, transactionFailureCallback, false);
// Since we don't use these nullify the reference so that the garbage collector can clean them up
preparedTransactions = null;
for (RecordInfo info : records)
{
byte[] data = info.data;
HornetQBuffer buff = HornetQBuffers.wrappedBuffer(data);
Object o = DescribeJournal.newObjectEncoding(info, storageManager);
if (info.getUserRecordType() == ADD_MESSAGE)
{
messages.put(info.id, ((MessageDescribe) o).msg);
}
else if (info.getUserRecordType() == ADD_LARGE_MESSAGE)
{
messages.put(info.id, ((MessageDescribe) o).msg);
}
else if (info.getUserRecordType() == ADD_REF)
{
ReferenceDescribe ref = (ReferenceDescribe) o;
HashMap<Long, ReferenceDescribe> map = messageRefs.get(info.id);
if (map == null)
{
HashMap<Long, ReferenceDescribe> newMap = new HashMap<Long, ReferenceDescribe>();
newMap.put(ref.refEncoding.queueID, ref);
messageRefs.put(info.id, newMap);
}
else
{
map.put(ref.refEncoding.queueID, ref);
}
}
else if (info.getUserRecordType() == ACKNOWLEDGE_REF)
{
acks.add(info);
}
else if (info.userRecordType == ACKNOWLEDGE_CURSOR)
{
CursorAckRecordEncoding encoding = new CursorAckRecordEncoding();
encoding.decode(buff);
Set<PagePosition> set = cursorRecords.get(encoding.queueID);
if (set == null)
{
set = new HashSet<PagePosition>();
cursorRecords.put(encoding.queueID, set);
}
set.add(encoding.position);
}
else if (info.userRecordType == PAGE_TRANSACTION)
{
if (info.isUpdate)
{
PageUpdateTXEncoding pageUpdate = new PageUpdateTXEncoding();
pageUpdate.decode(buff);
pgTXs.add(pageUpdate.pageTX);
}
else
{
PageTransactionInfoImpl pageTransactionInfo = new PageTransactionInfoImpl();
pageTransactionInfo.decode(buff);
pageTransactionInfo.setRecordID(info.id);
pgTXs.add(pageTransactionInfo.getTransactionID());
}
}
}
messageJournal.stop();
removeAcked(acks);
}