Прежде всего, я бы посоветовал, если возможно, использовать одну и ту же очередь для обоих типов сообщений - это будет самый быстрый вариант по ряду причин, основной из которых будет локальность памяти.
Однако Вы также можете выполнять циклическое чтение в нескольких очередях, например:
ChronicleQueue q1 = ...;
ChronicleQueue q2 = ...;
ExcerptTailer tailer1 = q1.createTailer();
ExcerptTailer tailer2 = q2.createTailer();
while (true) {
try (DocumentContext dc = tailer1.readingDocument()) {
if (dc.isPresent()) {
// do something with message type 1
}
}
try (DocumentContext dc = tailer2.readingDocument()) {
if (dc.isPresent()) {
// do something with message type 2
}
}
}
Или в стиле methodReader:
ChronicleQueue q1 = ...;
ChronicleQueue q2 = ...;
ExcerptTailer tailer1 = q1.createTailer();
ExcerptTailer tailer2 = q2.createTailer();
MethodReader reader1 = tailer1.methodReader(MessageTypeOneInterface.class);
MethodReader reader2 = tailer2.methodReader(MessageTypeTwoInterface.class);
while (true) {
reader1.readOne();
reader2.readOne();
}
Если в очереди нет новых сообщений, вызов tailer.readingDocument()
(или, что эквивалентно, reader.readOne()
) очень дешев (на самом деле это всего лишь несколько изменчивых операций чтения).