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());
ПРИМЕЧАНИЕ. Содержимое одинаковое, поэтому вы можете комбинировать два варианта.
Вы можете использовать очередь хроник вместо проводки, чтобы сохранить эту информацию.