Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ignite 在键或值中使用日期类型字段时出现“二进制类型具有不同的字段类型”错误_Ignite_Gridgain - Fatal编程技术网

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

我试图在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$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/,但仍然存在错误。