Chronicle Queue: как читать исключения/документы с разными WireKey?

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

      // Writes: {key1: TestMessage}
appender.writeDocument(w -> w.write("key1").text("TestMessage"));

// Writes: {key2: AnotherTextMessage}
appender.writeDocument(w -> w.write("key2").text("AnotherTextMessage"));

Вопрос:

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

Что я пробовал:

      // This can read both types of messages, but cannot
// tell which type a message belongs to.
tailer.readDocument(wire -> {
    wire.read().text();
});
      // This only reads type "key1" messages, skips all "key2" messages.
tailer.readDocument(wire -> {
    wire.read("key1").text();
});
      // This crashes. (because it advances the read position illegally?)
tailer.readDocument(wire -> {
    wire.read("key1").text();
    wire.read("key2").text();
});

Я надеялся, что смогу сделать что-то вроде wire.readKey()и получить WireKey документа, а затем перейти к чтению документа и его динамической обработке. Как я могу это сделать?

Примечание. Я знаю, что это можно сделать с помощью methodReaderа также methodWriter, и кажется, что документация/демонстрация рекомендует этот подход (?). Но я бы предпочел не использовать этот API и четко указывать чтение и запись сообщений. Я предполагаю, что должен быть способ выполнить этот вариант использования.

Спасибо.

1 ответ

Вы правы, например, MethodReader выполняет это.

Вы можете сделать это двумя способами

      // a reused StringBuilder
StringBuilder sb = new StringBuilder();
wire.read(sb); // populate the StringBuilder

или более удобный способ

      String name = wire.readEvent(String.class);
switch(name) {
    case "key1":
        String text1 = wire.getValueIn().text();
        // do something with text1
        break;

    case "key2":
        String text2 = wire.getValueIn().text();
        // do something with text1
        break;

    default:
        // log unexpected key
}

Для других читателей, которые не знают о MethodReader, те же самые сообщения могут быть получены с помощью

      interface MyEvents {
    void key1(String text1);
    void key2(String text2);
}

MyEvents me = wire.methodWriter(MyEvents.class);
me.key1("text1");
me.key2("text2");

MyEvents me2 = new MyEvents() {
    public void key1(String text1) {
        // handle text1
    }
    public void key2(String text2) {
        // handle text2
    }
};

Reader reader = wire.methodReader(MyEevents.class);
do {
} while(reader.readeOne());

ПРИМЕЧАНИЕ. Содержимое одинаковое, поэтому вы можете комбинировать два варианта.

Вы можете использовать очередь хроник вместо проводки, чтобы сохранить эту информацию.

Другие вопросы по тегам