Hazelcast ClassNotFound с использованием Near Cache в клиенте - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь использовать Hazelcast (3.9.2, 3.11 без разницы) следующим образом: я получил серверы Hazelcast (участники).Я запускаю их посвященными, а не встроенными.Я не хочу преподавать членам Hazelcast те классы, которые я хочу хранить в них.Я использовал связанный файл hazelcast.xml и сделал следующее дополнение (3.9.2)

<replicatedmap name="default">
    <in-memory-format>BINARY</in-memory-format>
    <statistics-enabled>true</statistics-enabled>
</replicatedmap>

Я также активировал TCP, а не Multicast (true / false). Это все, что я сделал.Я начал с одного участника, слушающего 127.0.0.1:5701

Затем я пытаюсь присоединить клиентов Hazelcast к участнику для хранения и извлечения Карт (в основном ReplicatedMaps, но Карты также не работают в моем сценарии)

Мой клиентский код выглядит следующим образом (Cache - это просто сериализуемый класс без атрибутов):

public class Main {
  public static final String HAZELCAST_INSTANCE_NAME = "HAZI";
  public static final String REPLICATEDMAP_NAME = "REP_MAP";
  public static final String MAP_NAME = "NORMAL_MAP";

public static void main(String[] args) {
    init();
    HazelcastInstance instance = HazelcastClient.getHazelcastClientByName(HAZELCAST_INSTANCE_NAME);
    Map<String, Object> repMap = instance.getReplicatedMap(REPLICATEDMAP_NAME);
    repMap.put("MyKey", new Cache());
    System.err.println("Retrieve " + repMap.get("MyKey"));
    Map<String, Object> normalMap = instance.getReplicatedMap(MAP_NAME);
    normalMap.put("MyKey", new Cache());
    System.err.println("Retrieve " + normalMap.get("MyKey"));
    System.exit(1);
}

private static void init() {
    ClientConfig cfg = new ClientConfig();
    cfg.setInstanceName(HAZELCAST_INSTANCE_NAME);
    cfg.addNearCacheConfig(defineNearCache(REPLICATEDMAP_NAME));
    cfg.addNearCacheConfig(defineNearCache(MAP_NAME));
    // for analysis in the hazelcast management console
    cfg.getProperties().put("hazelcast.client.statistics.enabled", "true");
    cfg.getProperties().put("hazelcast.client.statistics.period.seconds", "60");
    cfg.getNetworkConfig().addAddress("127.0.0.1:5701");
    if (HazelcastClient.newHazelcastClient(cfg) == null) {
        System.err.println(" !!! ERROR in Cache Config !!!");
    }
}
private static NearCacheConfig defineNearCache(String mapName) {
    EvictionConfig evictionConfig = new EvictionConfig()
            .setMaximumSizePolicy(EvictionConfig.MaxSizePolicy.ENTRY_COUNT)
            .setSize(200);
    return new NearCacheConfig()
            .setName(mapName)
            .setInMemoryFormat(InMemoryFormat.BINARY)
            .setInvalidateOnChange(true)
            .setEvictionConfig(evictionConfig);
}

}

Моя проблема сейчас такова: используя этот код, я получаю ClassNotFoundError, пытаясь поместить объекты в реплицированную картуили обычная карта, но на выделенном сервере Hazelcast (участник), а не на стороне клиента.

    SCHWERWIEGEND: [127.0.0.1]:5701 [dev] [3.9.2] hz._hzInstance_1_dev.event-3 caught an exception while processing task:com.hazelcast.spi.impl.eventservice.impl.LocalEventDispatcher@eeed098
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: de.empic.hazelwar.model.Cache
        at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:224)
        at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
        at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:185)
        at com.hazelcast.map.impl.DataAwareEntryEvent.getValue(DataAwareEntryEvent.java:90)
        at com.hazelcast.client.impl.protocol.task.replicatedmap.AbstractReplicatedMapAddEntryListenerMessageTask.handleEvent(AbstractReplicatedMapAddEntryListenerMessageTask.java:92)
        at com.hazelcast.client.impl.protocol.task.replicatedmap.AbstractReplicatedMapAddEntryListenerMessageTask.entryAdded(AbstractReplicatedMapAddEntryListenerMessageTask.java:132)
        at com.hazelcast.replicatedmap.impl.ReplicatedMapEventPublishingService.dispatchEvent(ReplicatedMapEventPublishingService.java:82)
        at com.hazelcast.replicatedmap.impl.ReplicatedMapService.dispatchEvent(ReplicatedMapService.java:247)
        at com.hazelcast.spi.impl.eventservice.impl.LocalEventDispatcher.run(LocalEventDispatcher.java:64)
        at com.hazelcast.util.executor.StripedExecutor$Worker.process(StripedExecutor.java:225)
        at com.hazelcast.util.executor.StripedExecutor$Worker.run(StripedExecutor.java:208)
Caused by: java.lang.ClassNotFoundException: de.empic.hazelwar.model.Cache
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:173)
    at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:147)
    at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:591)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:219)
    ... 10 more

Всякий раз, когда я удаляю конфигурацию ближнего кеша из конфигурации клиента, все работает довольно хорошо, кроме меняконечно, есть почти тайник.

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Моя проблема решена с помощью версии 3.11.1 hazelcast.

0 голосов
/ 04 декабря 2018

@ magicroomy, я запускаю одинаково на обоих 3.9.2 и 3.11.Я могу подтвердить, что:

  • Если вы измените Реплицированную Карту на Карту, она будет работать с или около Ближнего Кэша.
  • При использовании Реплицированной Карты, если определено Ближний Кэш, исключение выдается нана стороне сервера.
  • Без Near Cache, ReplicatedMap также работает.

Я также создал проблему github: https://github.com/hazelcast/hazelcast/issues/14210

...