1

我们将 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;
} 

当我们读回缓冲区时,大多数缓冲区大小都匹配,但对于某些缓冲区,例如 100 分之一,我们会获得额外的字节(0x008F 的 1/2/3 字节)。我们无法确定哪些缓冲区具有此填充,并且由于此填充而无法真正解组缓冲区。不明白为什么有些缓冲区有这些额外的字节?

4

3 回答 3

1

Chronicle 队列添加了填充,这样 4 字节的文档上下文标题就不会散乱 64 字节的缓存行。这是因为标头用于 CAS 操作,并且在大多数架构下,如果标头跨越高速缓存行边界,则 CAS 操作是非原子的。

于 2018-09-05T20:49:56.417 回答
0

如果要写入/读取 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);
    }

}

注意:从 Queue 5.16.14 版本开始,您将能够使用 writeText/readText

appender.writeText(text);

String s = tailer.readText();
于 2018-09-08T09:39:17.917 回答
0

保存字节:

appender.writeBytes(BytesStore.wrap(b));

读取没有任何填充字节:

Bytes<?> bytes = dc.wire().bytes();
int size = (int) bytes.readRemaining();
byte[] result = new byte[size];
for (int i = 0; i < size; i++) {
    result[i] = bytes.readByte();
}
于 2019-08-23T09:19:36.733 回答