Chronicle Queue使用writingDocument写入后无法读取的问题及用法查询
问题1 正确读写Chronicle Queue数据的方法
错误根因
你现有代码的核心问题是DocumentContext的使用逻辑错误:每次调用appender.writingDocument()获取的上下文对应一条独立的队列消息,你将1000次文本写入都放在同一个上下文生命周期中,相当于把1000个字符串无格式拼接写入同一条消息的二进制块,读取时直接调用readText()会因为内容格式不符合单条文本的编码规则抛出UTF解析异常。
正确写入代码
String basePath = OS.userDir() + "\\start"; ChronicleQueue queue = SingleChronicleQueueBuilder.single(basePath).build(); ExcerptAppender appender = queue.acquireAppender(); int i = 0; // 循环写多条消息,每条消息对应一个DocumentContext for (int j=0;j<1000;j++) { // 每次写消息都单独获取上下文,用try-with-resources自动关闭资源 try (DocumentContext documentContext = appender.writingDocument()) { documentContext.wire().write().text("text :: "+i++); } }
正确读取代码
两种读取方式都可正常使用:
方式1 直接读取文本(适配单条消息为纯文本的场景)
ExcerptTailer tailer = queue.createTailer("b"); String out; while ((out = tailer.readText()) != null){ System.out.println(out); }
方式2 通过DocumentContext读取(通用场景,兼容性更强)
ExcerptTailer tailer = queue.createTailer("b"); DocumentContext dc = tailer.readingDocument(); while (dc.isPresent()) { String text = dc.wire().read().text(); System.out.println(text); dc.close(); dc = tailer.readingDocument(); }
问题2 Chronicle Queue官方参考文档获取渠道
- 官方代码仓库:归属OpenHFT开源组织,搜索仓库名
OpenHFT/Chronicle-Queue即可找到,仓库内的README、WIKI板块包含大量入门示例、API说明和最佳实践 - 官方文档站点:OpenHFT官方文档站提供了完整的Chronicle Queue使用指南、进阶配置和常见问题排查方案,直接搜索Chronicle Queue官方文档即可访问
内容的提问来源于stack exchange,提问作者Asuka_Truth
相关产品推荐
相关产品推荐

