Следующий код дает сбой во втором утверждении утверждения на 20-й итерации — обратите внимание, что я просто воссоздаю свой код, вызвавший проблему; количество не имеет значения, а количество записанных байтов.
SingleChronicleQueue writer = SingleChronicleQueueBuilder.binary("/tmp/broken").build();
ExcerptAppender excerptAppender = writer.acquireAppender();
try(DocumentContext dc = excerptAppender.writingDocument())
{
dc.wire().bytes().writeSkip(36);
}
for(int i = 0; i < 20; i++)
{
try (DocumentContext dc = excerptAppender.writingDocument())
{
dc.wire().bytes().writeSkip(14);
}
}
SingleChronicleQueue reader = SingleChronicleQueueBuilder.binary("/tmp/broken").build();
ExcerptTailer tailer = reader.createTailer();
try(DocumentContext dc = tailer.readingDocument())
{
assert dc.isPresent() && dc.wire().bytes().readRemaining() == 36;
}
for(int i = 0; i < 20; i++)
{
try(DocumentContext dc = tailer.readingDocument())
{
//Fails on the 20th read .. with 16 bytes being returned
assert dc.isPresent() && dc.wire().bytes().readRemaining() == 14;
}
}
Проблема, по-видимому, связана с классом SingleChronicleQueueExcerpts, где к сообщению добавляется заполнение для выравнивания кэша по 64 байтам. Я не ожидал, что мне придется добавлять свои собственные длины сообщений к моим записям, но этого не избежать, если хроника-очередь не дополняет свой собственный заголовок к границе строки кэша.
заранее спасибо