IllegalArgumentException初始化编年史地图

时间:2019-01-07 05:47:51

标签: java chronicle-map

这是我拥有的代码

MyValue sampleValue = Values.newHeapInstance(MyValue.class); 

// subsequently set the couple of floats and int i have defined in MyValue interface

ChronicleMap<MyKey, MyValue> cache = ChronicleMapBuilder.of(MyKey.class, MyValue.class)
                .entries(100)
                .averageValue(sampleValue)
                .create();

执行此操作时出现错误

  

java.lang.IllegalArgumentException:使用BytesMarshallable和   在以下位置不支持接口值类型   net.openhft.chronicle.map.ChronicleMapBuilder.averageValue(ChronicleMapBuilder.java:660)

有人可以帮助我了解此使用方式是否正确吗?

如果我改为通过实现一个具体的类来创建MyValue,然后对其进行如下操作,那么它将起作用:

MyValue sampleValue = new MyValueImpl();

// subsequently set the couple of floats and int i have defined in MyValue interface

ChronicleMap<MyKey, MyValue> cache = ChronicleMapBuilder.of(MyKey.class, MyValue.class)
                .entries(100)
                .averageValue(sampleValue)
                .create();

2 个答案:

答案 0 :(得分:0)

此异常的原因可以在source中找到:

            if (Serializable.class.isAssignableFrom(valueClass))
                LOG.warn("BytesMarshallable " + valueClass + " will be serialized as Serializable as the value class is an interface");
            else
                throw new IllegalArgumentException("Using BytesMarshallable and an interface value type not supported");
}

只需调用Class类的isAssignableFrom方法即可检查:

  

确定此Class对象表示的类还是接口   与该对象相同,或者是该对象的超类或超接口   指定的Class参数表示的class或接口。它   如果是,则返回true;否则返回false。如果此Class对象   表示原始类型,如果指定   Class参数正是此Class对象;否则返回   错误。

因此,这检查Serializable类是否由valueClass表示。因此,我的理解是您的MyValue未实现Serializable接口。

是的,甚至评论也指出了这一点:

  

配置平均字节数,采用序列化形式   值

因此,如果我没记错的话,只需让您的Value Class实现Serializable接口,就可以了。我会说的……相当令人困惑的异常消息。

答案 1 :(得分:0)

使用Values.newHeapInstance()表示MyValue是所谓的value interface。特定值接口的对象具有序列化形式的恒定大小。值接口特别受ChronicleMap支持,因此您根本不应该配置值大小,如this example from tutorial中所述:

ChronicleMap<LongValue, Order> orders = ChronicleMap
    .of(LongValue.class, Order.class)
    .name("orders-map")
    .entries(1_000_000)
    .create();

LongValue key = Values.newHeapInstance(LongValue.class);
key.setValue(id);
orders.put(key, order);

请注意,没有averageValue()调用,也没有averageValueSize(),也没有constantValueSizeBySample()

给出的错误消息确实令人困惑,特别是因为ChronicleMap已经知道值类是一个值接口并且知道其大小。随时在https://github.com/OpenHFT/Chronicle-Map中打开问题。