«Двоичный тип имеет разные типы полей» Ошибка при использовании поля «Тип даты» в поле «Ключ или Значение» - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь использовать поле типа java.util.Date в моих объектах Ignite Key и Value.Но когда я начинаю кешировать данные в том же кеше Ignite, используя код Java, я получаю следующую ошибку.

[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 cache, который определяется следующим образом:

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

Как упомянуто в ссылке http://apache -ignite-users.70518.x6.nabble.com / Binary-type-has-different-fields-error-td21540.html , я даже удалил содержимое из каталога $IGNITE_HOME/work/ и перезапустил узел.Но все же ошибка есть.Что вызывает эту ошибку?Также та же ошибка возникает, если поле типа java.util.Date используется только в значении кэша (не в ключе).

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Проблема была в ignitevisor.Я использовал Node Singleton режим развертывания службы Ignite, в котором приложение развертывается на каждом экземпляре Ignite в кластере.В то же время конфигурация также применялась к ignitevisor.Теперь при следующем запуске ignitevisor был ON со старой конфигурацией.Поэтому, когда я развернул новое приложение в кластере, используя режим развертывания службы Node Singleton, возник конфликт между старым и новым типами объектов <key, value>, поскольку ignitevisor содержал старую конфигурацию.

0 голосов
/ 27 ноября 2018

Возможно ли, что у вас работают другие узлы, на которых развернута старая версия кода, где timestamp равно String?

Обратите внимание, что в вашем фрагменте это tstamp, но в сообщении об ошибке этоэто timestamp.Есть ли какая-то случайная путаница?Очистите его, удалите work/ на всех узлах и повторите попытку.

...