Чтение из 2-х хронических очередей с использованием одного потока - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать службу, в которой я получу один тип сообщения в одной хронической очереди и другой тип сообщения в другой хронической очереди в рамках одного и того же процесса. Я не хочу выделять 2 выделенных потока для каждой из этих очередей, так как частота этих сообщений не будет очень высокой, даже если на них нужно отвечать с минимально возможной задержкой. Я все еще могу дать один поток для обеих очередей. Что бы вы посоветовали сделать так, чтобы я мог читать две или несколько очередей, используя один поток?

1 Ответ

0 голосов
/ 13 марта 2020

Прежде всего, я бы посоветовал, если возможно, использовать одну и ту же очередь для обоих типов сообщений - это будет самый быстрый вариант по ряду причин, основной из которых будет локальность памяти.

Однако Вы также можете выполнять циклическое чтение в нескольких очередях, например:

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()) очень дешев (на самом деле это всего лишь несколько изменчивых операций чтения).

...