Ignite 在键或值中使用日期类型字段时出现“二进制类型具有不同的字段类型”错误
我试图在Ignite键和值对象中使用java.util.Date类型字段。但当我开始使用Java代码在同一个Ignite缓存中缓存数据时,我得到以下错误Ignite 在键或值中使用日期类型字段时出现“二进制类型具有不同的字段类型”错误,ignite,gridgain,Ignite,Gridgain,我试图在Ignite键和值对象中使用java.util.Date类型字段。但当我开始使用Java代码在同一个Ignite缓存中缓存数据时,我得到以下错误 [12:43:01,485][SEVERE][pool-8-thread-1][] Message is ignored due to an error [msg=MessageAndMetadata(test1,2,Message(magic = 1, attributes = 0, CreateTime = -1, crc = 370525
[12:43:01,485][SEVERE][pool-8-thread-1][] Message is ignored due to an error [msg=MessageAndMetadata(test1,2,Message(magic = 1, attributes = 0, CreateTime = -1, crc = 3705259101, key = java.nio.HeapByteBuffer[pos=0 lim=4 cap=3288], payload = java.nio.HeapByteBuffer[pos=0 lim=3280 cap=3280]),302,kafka.serializer.DefaultDecoder@2d50c6a2,kafka.serializer.DefaultDecoder@1ff7596c,-1,CreateTime)]
class org.apache.ignite.binary.BinaryObjectException: Binary type has different field types [typeName=test.demo.DataKey, fieldName=tstamp, fieldTypeName1=String, fieldTypeName2=Date]
at org.apache.ignite.internal.binary.BinaryUtils.mergeMetadata(BinaryUtils.java:1027)
at org.apache.ignite.internal.processors.cache.binary.BinaryMetadataTransport$MetadataUpdateProposedListener.onCustomEvent(BinaryMetadataTransport.java:293)
at org.apache.ignite.internal.processors.cache.binary.BinaryMetadataTransport$MetadataUpdateProposedListener.onCustomEvent(BinaryMetadataTransport.java:258)
at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$4.onDiscovery0(GridDiscoveryManager.java:707)
at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$4.onDiscovery(GridDiscoveryManager.java:589)
at org.apache.ignite.spi.discovery.tcp.ServerImpl$RingMessageWorker.notifyDiscoveryListener(ServerImpl.java:5479)
at org.apache.ignite.spi.discovery.tcp.ServerImpl$RingMessageWorker.processCustomMessage(ServerImpl.java:5305)
at org.apache.ignite.spi.discovery.tcp.ServerImpl$RingMessageWorker.processMessage(ServerImpl.java:2765)
at org.apache.ignite.spi.discovery.tcp.ServerImpl$RingMessageWorker.processMessage(ServerImpl.java:2536)
at org.apache.ignite.spi.discovery.tcp.ServerImpl$MessageWorkerAdapter.body(ServerImpl.java:6775)
at org.apache.ignite.spi.discovery.tcp.ServerImpl$RingMessageWorker.body(ServerImpl.java:2621)
at org.apache.ignite.spi.IgniteSpiThread.run(IgniteSpiThread.java:62)
其中DataKey是Ignite缓存密钥,定义如下:
package test.demo;
import java.util.Date;
public class DataKey{
private Long sess_id ;
private Long s_id;
private Long version;
private Date tstamp;
public DataKey(Long sess_id, Long s_id, Long version,
Date tstamp) {
super();
this.sess_id = sess_id;
this.s_id = s_id;
this.version = version;
this.tstamp = tstamp;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((s_id == null) ? 0 : s_id.hashCode());
result = prime * result
+ ((sess_id == null) ? 0 : sess_id.hashCode());
result = prime * result
+ ((tstamp == null) ? 0 : tstamp.hashCode());
result = prime * result + ((version == null) ? 0 : version.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DataKey other = (DataKey) obj;
if (s_id == null) {
if (other.s_id != null)
return false;
} else if (!s_id.equals(other.s_id))
return false;
if (sess_id == null) {
if (other.sess_id != null)
return false;
} else if (!sess_id.equals(other.sess_id))
return false;
if (tstamp == null) {
if (other.tstamp != null)
return false;
} else if (!tstamp.equals(other.tstamp))
return false;
if (version == null) {
if (other.version != null)
return false;
} else if (!version.equals(other.version))
return false;
return true;
}
}
正如链接中提到的,我甚至删除了$IGNITE_HOME/work/directory中的内容,并重新启动了节点。但仍然存在错误。
是什么导致了这个错误?如果java.util.Date类型字段仅在缓存值中使用,而不在键中使用,也会发生相同的错误 是否可能有其他正在运行的节点部署了旧版本的代码,其中时间戳是字符串
请注意,在代码段中是tstamp,但在错误消息中是timestamp。有没有可能有一些随机的混乱?清除它,删除所有节点上的工作,然后重试。问题已解决。我使用了Ignite的节点单例服务部署模式,其中应用程序部署在集群中的每个Ignite实例上。同时,配置也被应用到ignitevisor。现在,在下一次运行期间,ignitevisor使用旧配置打开。因此,当我使用节点单例服务部署模式在集群上部署新应用程序时,旧对象类型和新对象类型之间存在冲突,因为ignitevisor持有旧配置。我在此处发布密钥类时重命名了字段,这就是密钥类和错误日志中名称不匹配的原因。现在我已经在错误日志中更正了它。没有其他节点使用字段的字符串数据类型运行,只有一个节点使用日期类型运行。我还尝试从节点中删除$IGNITE_HOME/work/,但仍然存在错误。