"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
类型字段仅用于缓存值(而不是键),也会发生同样的错误。
您是否有其他节点 运行 部署了旧版本的代码,其中 timestamp
是 String
?
请注意,在您的代码段中它是 tstamp
,但在错误消息中它是 timestamp
。有没有可能有一些随机的混淆?清除它,删除所有节点上的 work/
,然后重试。
问题出在 ignitevisor
。我用过Ignite的Node Singleton
服务部署方式,应用部署在集群中的每个Ignite实例上。同时配置也被应用到 ignitevisor
。现在在下一个 运行 ignitevisor
期间使用旧配置 ON
。因此,当我使用 Node Singleton
服务部署模式在集群上部署新应用程序时,新旧 <key, value>
对象类型之间存在冲突,因为 ignitevisor
持有旧配置。
我正在尝试在我的 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
类型字段仅用于缓存值(而不是键),也会发生同样的错误。
您是否有其他节点 运行 部署了旧版本的代码,其中 timestamp
是 String
?
请注意,在您的代码段中它是 tstamp
,但在错误消息中它是 timestamp
。有没有可能有一些随机的混淆?清除它,删除所有节点上的 work/
,然后重试。
问题出在 ignitevisor
。我用过Ignite的Node Singleton
服务部署方式,应用部署在集群中的每个Ignite实例上。同时配置也被应用到 ignitevisor
。现在在下一个 运行 ignitevisor
期间使用旧配置 ON
。因此,当我使用 Node Singleton
服务部署模式在集群上部署新应用程序时,新旧 <key, value>
对象类型之间存在冲突,因为 ignitevisor
持有旧配置。