Тайлер Chroncile Queue добавляет дополнительные байты (0x008F) для некоторых буферов. Как определить, какие буферы имеют этот отступ? - PullRequest
0 голосов
/ 05 сентября 2018

Мы собираем данные XML в виде строки и преобразуем их в байты с getBytes(StandardCharsets.UTF_8) и записываем их в очередь хроники:

try (DocumentContext dc = appender.writingDocument()) {
    Wire wire = dc.wire();
    Bytes bytes = wire.bytes();
    bytes.write(message);
}

и читать так:

DocumentContext dc = tailer.readingDocument();
if (dc.isPresent()) {
    Bytes bytes = dc.wire().bytes();
    int length = bytes.length();
    byte[] output = new byte[length];
    bytes.read(output);
    return output;
} 

Когда мы читаем буферы обратно, большинство размеров буферов совпадают, но для некоторых буферов, таких как 1 на 100, мы получаем дополнительные байты (1/2/3 байта 0x008F). Мы не могли определить, какие буферы имеют это заполнение, и не могли действительно демонтировать буфер из-за этого заполнения. Не можете понять, почему некоторые буферы имеют эти дополнительные байты?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Если вы хотите записывать / читать XML-данные, вам лучше позволить очереди кодировать и декодировать эту строку, так как это сохраняет создание byte[]

try (DocumentContext dc = appender.writingDocument()) {
    dc.wire().getValueOut().text(text);
}

и

// can be reused.
StringBuilder sb = new StringBuilder();

try (DocumentContext dc = tailer.readingDocument()) {
    if (dc.isPresent()) {
        dc.wire().text(sb);
        String text = sb.toString();
        process(text);
    }

}

ПРИМЕЧАНИЕ. Начиная с версии 5.16.14 Queue, вы сможете использовать writeText / readText

appender.writeText(text);

и

String s = tailer.readText();
0 голосов
/ 05 сентября 2018

Хроническая очередь добавляет заполнение, чтобы 4-байтовые заголовки контекста документа не перекрывали 64-байтовые строки кэша. Это связано с тем, что заголовки используются в операциях CAS, и в большинстве архитектур операция CAS не атомарна, если заголовки пересекают границу строки кэша.

...