Chronicle Wire消息解析器示例

时间:2018-02-09 06:55:46

标签: chronicle

我现在正在使用grizzly框架,并寻找一种方法来改善我们的交换直接市场访问连接的延迟。

我们的交换信息格式如下:

  • 固定长度标题
  • 消息类型和有效负载长度存储在标题
  • 修复长度字符串字段(例如,为字符串字段分配固定的20个字节)

在grezzly中,我可以像这个例子一样轻松创建一个消息解析器: https://javaee.github.io/grizzly/coreframeworksamples.html#/Parsing_an_incoming_message

我正在寻找一个关于如何在Chronicle-Network和Wire中创建相同解析器的示例或教程。

更新:

如何从已分配固定长度的Wire读取/写入String?说写作' 12345678'进入一个固定的20字节空间。该字符串将在前8个字节打包,剩余的12个字节将用NULL字节填充。

这是我的代码。它有效,但我认为这不是正确的方法。

private static final byte START_OF_MESSAGE = 0x02;

private int length;

private String compId;

@Override
public void readMarshallable(WireIn in) throws IORuntimeException {

    in.bytes().readByte();

    // first field
    length = in.bytes().readInt();

    // second field
    byte[] b = new byte[LENGTH_COMP_ID];
    in.bytes().read(b);
    compId = new String(b).trim();
}

@Override
public void writeMarshallable(WireOut out) {
    out.bytes().writeByte(START_OF_MESSAGE);

    // first field
    out.bytes().writeInt(length);

    /** second field, converting the string to byte[] */
    out.bytes().write(getBytes(compId, LENGTH_COMP_ID));
}

/**
 * retrieve a byte array of str with length = len
 */
private byte[] getBytes(String str, int len) {
    if (str == null) {
        return null;
    }
    byte[] b = new byte[len];
    if (str.length() > len) {
        return str.substring(0, len).getBytes();
    } else {
        byte[] b2 = str.getBytes();
        for (int i = 0 ; i < b2.length ; i++) {
            b[i] = b2[i];
        }
    }
    return b;
}

1 个答案:

答案 0 :(得分:0)

我建议您查看Wire中的测试用例,如果您想要我们提供付费培训课程的教程,请联系sales@chronicle.software