java - 从历史队列中读取 byte[]

标签 java chronicle-queue

我正在使用以下代码将 byte[] 写入历史记录队列,

excerptAppender.writeBytes(b -> b.write(data));

如何从队列中读回相同的字节[]。我发现了这样的东西,

excerptTailer.readBytes(b-> b.read(bytes));

但在这种情况下我需要长度。我是否需要单独写入长度并读取相同的长度来创建字节[]。?

或者有没有一种方法可以让框架本身处理长度,这样我们就可以读取,

excerptTailer.readBytes();

我找不到太多关于此的文档。

从 github 获取此示例,

    assertTrue(tailer.readBytes(b -> {
    long address = b.address(b.readPosition());
    Unsafe unsafe = UnsafeMemory.UNSAFE;
    int code = unsafe.getByte(address);
    address++;
    int num = unsafe.getInt(address);
    address += 4;
    long num2 = unsafe.getLong(address);
    address += 8;
    int length = unsafe.getByte(address);
    address++;
    byte[] bytes = new byte[length];
    unsafe.copyMemory(null, address, bytes, Unsafe.ARRAY_BYTE_BASE_OFFSET, bytes.length);
    String text = new String(bytes, StandardCharsets.UTF_8);
    assertEquals("Hello World", text);
    // do something with values
}));

这是否建议用于生产?

最佳答案

很抱歉回复这么旧的帖子,认为有人可以从中受益。

您可以定义大约一次的缓冲区大小(相当大),框架提供实际的数据长度。看看下面对我有用的代码

  private byte[] readData() {
    SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary("./temp/").build();
    ExcerptTailer tailer = queue.createTailer("my-single-tailer");
    byte[] data = null;
    Bytes<ByteBuffer> bytes = Bytes.elasticHeapByteBuffer(1024 * 128);
    boolean read = tailer.readBytes(bytes);
    if (read) {
      byte[] readData = bytes.underlyingObject().array();
      int len = (int) bytes.readRemaining();
      bytes.clear();
      data = Arrays.copyOf(readData, len);
    }
    return data;
  }

示例写入数据代码是

private void writeData(byte[] data) {
    SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary("./temp/").rollCycle(RollCycles.HOURLY).build();
    ExcerptAppender appender = queue.acquireAppender();

    Bytes<ByteBuffer> bytes = Bytes.elasticByteBuffer(1024 * 128);
    bytes.ensureCapacity(data.length);

    ByteBuffer byteBuffer = bytes.underlyingObject();
    byteBuffer.put(data);
    bytes.readPositionRemaining(0, byteBuffer.position());
    appender.writeBytes(bytes);
    byteBuffer.clear();
  }

关于java - 从历史队列中读取 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44780240/

相关文章:

java - Elasticsearch java API : matchAll search query doesn't return results?

java - 将值从 Java 传递给 javascript

java - 读取历史记录队列中写入的最后一个元素

java - 重新启动追加器时,历史记录队列尾部停止

java - 会影响 Java 内存使用的 Linux 配置?

java - 无法在 UserRecyclerAdapter 类中使用 "custom_list_users.xml"来膨胀 fragment

java - Chronicle Queue 可以像 RMI 一样使用吗?

java - Chronicle 队列事件监听器

java - 模糊的 Java 导入语法?

Chronicle Queue - 从上次读取位置读取,如果所有消费者都读取则删除文件