最近项目的集群框架要从Hazelcast迁移到Ignite,简单记一下使用中遇到的问题。
目前我使用的Ignite版本为1.9.0
,JDK1.7
.
IgniteCache无法正确存取对象数组
public class CacheExample {
public static void main(String[] args) throws IgniteException {
try (Ignite ignite = Ignition.start()) {
try (IgniteCache<String, Long[]> cache = ignite.getOrCreateCache("cache-test")) {
System.out.println("##################");
String k = "key";
Long[] arr = new Long[]{1L, 2L};
cache.put(k, arr);
System.out.println(cache.get(k));
System.out.println(cache.get(k).getClass());
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样使用会有如下报错
#
[Ljava.lang.Object;@e39f6f1
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Long;
at org.apache.ignite.examples.datagrid.CacheExample.main(CacheExample.java:25)
经测试发现IgniteCache对于值为对象数组时均无法正确取出,这里提供一个简单的办法,可以将对象数组转成List存入,取出时再转成数组。
判断对象是否是对象数组类型的方法如下
/**
* 判断是否是对象数组
* @param obj
* @return
*/
private static boolean isNonPrimitiveArray(Object obj) {
if (obj == null) {
return false;
} else {
Class<? extends Object> clz = obj.getClass();
if (clz.isArray()) {
if (clz.getComponentType().isPrimitive()) {
return false;
} else {
return true;
}
} else {
return false;
}
}
}