"Binary type has different field types" 在键或值中使用日期类型字段时出错

"Binary type has different field types" Error when using Date type field in Key or Value

我正在尝试在我的 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 = 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.onDiscovery0(GridDiscoveryManager.java:707)
    at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.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 cache Key,定义如下,

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;
    }
}

如 link http://apache-ignite-users.70518.x6.nabble.com/Binary-type-has-different-fields-error-td21540.html 中所述,我什至删除了 $IGNITE_HOME/work/ 目录中的内容并重新启动了节点。但仍然存在错误。 是什么导致了这个错误?如果 java.util.Date 类型字段仅用于缓存值(而不是键),也会发生同样的错误。

您是否有其他节点 运行 部署了旧版本的代码,其中 timestampString

请注意,在您的代码段中它是 tstamp,但在错误消息中它是 timestamp。有没有可能有一些随机的混淆?清除它,删除所有节点上的 work/,然后重试。

问题出在 ignitevisor。我用过Ignite的Node Singleton服务部署方式,应用部署在集群中的每个Ignite实例上。同时配置也被应用到 ignitevisor。现在在下一个 运行 ignitevisor 期间使用旧配置 ON。因此,当我使用 Node Singleton 服务部署模式在集群上部署新应用程序时,新旧 <key, value> 对象类型之间存在冲突,因为 ignitevisor 持有旧配置。