Получение Hazelcast Native Client, работающего с Hibernate 5.2.x - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь заставить Hazelcast работать с Hibernate, но если я не использую опцию super_client, она не запустится.

Согласно документам, Super Client следует использовать только в том случае, если ваше приложение находится в том же RAC или центре обработки данных. Для локальных это будет так, для производства они будут определенно разделены, так что Native Client - единственный вариант, который будет работать для нас.

Super Client является членом кластера, он имеет сокетное соединение с каждый член в кластере, и он знает, где данные, поэтому он будет получить данные гораздо быстрее. Но у Super Client есть кластеризация накладные расходы, и он должен быть в том же центре обработки данных, даже на том же RAC. Однако собственный клиент не является членом и полагается на один из кластеров члены. Собственные клиенты могут находиться в любом месте локальной или глобальной сети. Масштабируется намного лучше и накладных расходов намного меньше. Так что, если ваши клиенты меньше чем узлы Hazelcast, то Супер-клиент может быть вариантом; иначе обязательно попробуйте Native Client. Как правило: попробуйте Native client Во-первых, если он не работает достаточно хорошо для вас, тогда рассмотрите Супер клиент.

Лучшим вариантом для запуска Hazelcast является использование Docker:

docker pull hazelcast/hazelcast:3.10.4
docker run --name=hazelcast -d=true -p 5701:5701 hazelcast/hazelcast:3.10.4

И вот как это выглядит, когда он запущен и работает, я дважды проверил, что порт Hazelcast, 5701, открыт, что он явно.

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
77a5a0bed5eb        hazelcast/hazelcast:3.10.4   "bash -c 'set -euo p…"   3 days ago          Up 6 hours          0.0.0.0:5701->5701/tcp   hazelcast

В док-хабе docs также упоминается, как передать в JAVA_OPTS, я не уверен, является ли это обязательным или необязательным, и какова его цель, но это не помогло мне начать работу:

-e JAVA_OPTS = "- Dhazelcast.local.publicAddress = 127.0.0.1: 5701"

telnet 127.0.0.1 5701 успешно подключается к localhost:5701, поэтому я знаю, что порт открыт. В докере документации не указано, какой пароль по умолчанию используется для этого запущенного экземпляра Hazelcast, я предполагаю, что он пустой или пароль dev-pass, как упоминалось в нескольких более старых руководствах.

Я использую Hibernate 5.2.13.Final

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
        <exclusions>
            <exclusion>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
            </exclusion>
            <exclusion>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${hibernate-validator.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

Для Hazelcast, согласно документам, требуются две зависимости,

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast</artifactId>
        <version>3.10.4</version>
    </dependency>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-hibernate52</artifactId>
        <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-client</artifactId>
        <version>3.10.4</version>
    </dependency>

Документы показывают следующие ссылки:

enter image description here

Нажатие на Hibernate 5 показывает, что hazelcast-hibernate52 является правильной зависимостью

enter image description here

Когда я нажимаю See here для получения подробной информации, меня встречают документы, которые выглядят несколько устаревшими:

enter image description here

Предполагая, что есть только опечатка, я перехожу к примеру :

<!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.use_query_cache">false</property>
        <property name="hibernate.cache.use_minimal_puts">true</property>
        <property name="hibernate.cache.region.factory_class">com.hazelcast.hibernate.HazelcastCacheRegionFactory</property>
        <property name="hibernate.cache.hazelcast.use_native_client">false</property>
        <property name="hibernate.cache.hazelcast.native_client_hosts">127.0.0.1</property>
        <property name="hibernate.cache.hazelcast.native_client_group">hibernate</property>
        <property name="hibernate.cache.hazelcast.native_client_password">password</property>
        <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.EmbeddedDriver</property>
        <property name="hibernate.connection.url">jdbc:derby:hibernateDB</property>
        <mapping resource="Employee.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

В этом примере Use Native Client имеет значение false, но он настраивается, это опечатка или это правильная конфигурация?

Я пробую эти настройки на стандартном Hibernate Postgres с настройкой C3P0, вот мой persistence.xml

        <properties>

            <!-- Hibernate Config -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL95Dialect" />
            <property name="hibernate.generate_statistics" value="false" />

            <property name="hibernate.hbm2ddl.auto" value="validate"/>

            <property name="hibernate.physical_naming_strategy" value="za.co.convirt.util.CustomApplicationNamingStrategy"/>

            <property name="hibernate.connection.charSet" value="UTF-8"/>
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.use_sql_comments" value="false"/>

            <!-- JDBC Config -->
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />

            <property name="javax.persistence.jdbc.time_zone" value="UTC" />
            <property name="hibernate.jdbc.time_zone" value="UTC"/>

            <!-- Connection Pool -->
            <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />
            <property name="hibernate.c3p0.max_size" value="5" />
            <property name="hibernate.c3p0.min_size" value="1" />
            <property name="hibernate.c3p0.acquire_increment" value="1" />
            <property name="hibernate.c3p0.idle_test_period" value="300" />
            <property name="hibernate.c3p0.max_statements" value="0" />
            <property name="hibernate.c3p0.timeout" value="100" />

            <!-- Batch writing -->
            <property name="hibernate.jdbc.batch_size" value = "50"/>
            <property name="hibernate.order_updates" value = "true"/>
            <property name="hibernate.jdbc.batch_versioned_data" value = "true"/>

        </properties>

Некоторые параметры вводятся программно с помощью (это использовалось целую вечность, поэтому я знаю, что это работает, но добавив его здесь на всякий случай, если это поможет сделать код более понятным)

fun paramsFromArgs(args: Array<String>): Map<String, String> {
    val hibernateMap = mutableMapOf<String, String>()
    args.forEach {
        if (it.isNotBlank()) {
            if (it.startsWith("hibernate") || it.startsWith("javax.persistence")) {
                val split = it.split("=", limit = 2)
                hibernateMap.put(split.get(0), split.get(1))
            }
        }
    }
    return hibernateMap
}

Теперь, когда я устанавливаю кэш второго уровня с Hazelcast:

paramsDefault.add("hibernate.cache.use_query_cache=true")
paramsDefault.add("hibernate.cache.use_second_level_cache=true")
paramsDefault.add("hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory")
paramsDefault.add("hibernate.cache.provider_configuration_file_resource_path=hazelcast.xml")
paramsDefault.add("hibernate.cache.hazelcast.use_native_client=false")
paramsDefault.add("hibernate.cache.hazelcast.native_client_address=127.0.0.1")
paramsDefault.add("hibernate.cache.hazelcast.native_client_group=dev")
paramsDefault.add("hibernate.cache.hazelcast.native_client_password=dev-pass22222asfasdf")
paramsDefault.add("hibernate.cache.hazelcast.client.statistics.enabled=true")

Database.setupEntityManagerFactory("default",
                Database.paramsFromArgs(paramsDefault.toTypedArray()))

Установка для use_native_client значения false, как в примере, похоже, ничего не делает, с журналами в режиме отладки я не вижу ничего связанного с Hazelcast.

Переключение на true (что более логично, если учесть, что он настроен на использование пароля и IP-адреса, при запуске запускается.

hibernate.cache.hazelcast.use_native_client = истина hibernate.cache.hazelcast.native_client_address = 127.0.0.1 hibernate.cache.hazelcast.native_client_group = DEV hibernate.cache.hazelcast.native_client_password = DEV-передача

DEB [16:18:26.531] setup org.hibernate.jpa.internal.util.LogHelper PersistenceUnitInfo [
    name: default
    persistence provider classname: org.hibernate.jpa.HibernatePersistenceProvider
    classloader: null
    excludeUnlistedClasses: false
    JTA datasource: null
    Non JTA datasource: null
    Transaction type: RESOURCE_LOCAL
    PU root URL: file:/Users/vlad/Code/.../...
    Shared Cache Mode: null
    Validation Mode: null
    Jar files URLs []
    Managed classes names []
    Mapping files names []
    Properties [
        ...  
        hibernate.jdbc.time_zone: UTC
        javax.persistence.jdbc.password: 
        hibernate.cache.region.factory_class: com.hazelcast.hibernate.HazelcastCacheRegionFactory
        hibernate.c3p0.idle_test_period: 300
        hibernate.cache.hazelcast.use_native_client: true
        ...         
        hibernate.cache.hazelcast.native_client_group: dev
        ...
        javax.persistence.jdbc.driver: org.postgresql.Driver
        hibernate.use_sql_comments: false
        hibernate.cache.hazelcast.native_client_address: 127.0.0.1
        ...
        hibernate.cache.hazelcast.client.statistics.enabled: true
        hibernate.dialect: org.hibernate.dialect.PostgreSQL95Dialect
        hibernate.cache.provider_configuration_file_resource_path: hazelcast.xml]

HazelcastCacheRegionFactory используется согласно журналам:

    DEB [16:18:26.884] setup org.hibernate.cache.internal.RegionFactoryInitiator 
Cache region factory : com.hazelcast.hibernate.HazelcastCacheRegionFactory

За ними следуют две записи журнала, которые не соответствуют моему стандарту ведения журнала (я полагаю, он не использует SLF4j?):

Sep 12, 2018 2:18:29 PM com.hazelcast.hibernate.HazelcastCacheRegionFactory
INFO: Starting up HazelcastCacheRegionFactory

... и затем невозможно построить Hibernate Session Factory:

ERR [16:18:29.802] setup ApplicationApi [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException (EntityManagerFactoryBuilderImpl.java:970)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build (EntityManagerFactoryBuilderImpl.java:895)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory (HibernatePersistenceProvider.java:58)
    at javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:55)
    at za.co.convirt.util.Database.setupEntityManagerFactory (Database.kt:20)
    at za.co.convirt.util.Database.setupEntityManagerFactory$default (Database.kt:19)
    at ApplicationApi$main$hibernateThread$1.invoke (ApplicationApi.kt:171)
    at ApplicationApi$main$hibernateThread$1.invoke (ApplicationApi.kt:26)
    at kotlin.concurrent.ThreadsKt$thread$thread$1.run (Thread.kt:30)

Чтобы убедиться, что это не дает сбоя из-за отсутствия аннотаций на сущностях, я добавил несколько аннотаций @Cache для сущностей, но это не имеет значения.

@Table
@Entity
@EntityListeners(AuditListener::class)
@PersistenceContext(unitName = "default")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "Seat")
class Seat(
    name: String,
    ...

Я также добавил hazelcast.xml, не уверен, нужно ли это или нет:

<hazelcast
        xmlns="http://www.hazelcast.com/schema/config"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.hazelcast.com/schema/config
            http://www.hazelcast.com/schema/config/hazelcast-config-3.11.xsd">

    <services enable-defaults="true"/>

</hazelcast>

Поддерживается ли hibernate 5.2.x? ( этот билет показывает, что проблемы с Hibernate 5.2 были исправлены, поэтому я предполагаю, что он должен работать)

Я хочу запустить автономный экземпляр Hazelcast на одном сервере, и несколько экземпляров приложения используют его в качестве центрального кэша. Что мне не хватает в настройке, чтобы заставить его работать?


Обновление 1 :

Я написал небольшой фрагмент кода, который успешно подключается к локальному экземпляру hazelcast (он находится на моем компьютере разработчика, так же, как и с остальным кодом)

import com.hazelcast.client.HazelcastClient
import com.hazelcast.client.config.ClientConfig
import java.util.*

fun main(args: Array<String>) {

    val config = ClientConfig()
    config.getNetworkConfig().addAddress("127.0.0.1:5701")
    val hazelcastInstance = HazelcastClient.newHazelcastClient(config)

    val map = hazelcastInstance.getMap<String, String>("blah")
    map.forEach { t, u ->
        println(" $t -> $u ")
    }

    map.put("${Random().nextInt()}", "${Random().nextInt()}")

    hazelcastInstance.shutdown()

}

Чтобы доказать, что он хранится и извлекается из кеша, я перезагружаю метод main несколько раз, и каждый раз число записей в blah увеличивается

Run1: 
    No printlns
Run2: 
    1498523740 -> -1418154711 
Run3: 
    1498523740 -> -1418154711 
    -248583979 -> -940621527 

Значит, Hazelcast работает правильно ...


Обновление 2 :

Теперь я могу подключить Hazelcast из Hibernate, но он выдает исключение для каждого поиска.

Удаление hazelcast.xml из моего пути к классам, а затем удаление параметров группы и пароля, Hibernate запускается и подключается.

paramsDefault.add("hibernate.cache.use_query_cache=true")
paramsDefault.add("hibernate.cache.use_second_level_cache=true")
paramsDefault.add("hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory")
paramsDefault.add("hibernate.cache.hazelcast.use_native_client=true")
paramsDefault.add("hibernate.cache.hazelcast.native_client_address=127.0.0.1")

Выходы:

Sep 13, 2018 6:02:37 PM com.hazelcast.hibernate.HazelcastCacheRegionFactory
INFO: Starting up HazelcastCacheRegionFactory
Sep 13, 2018 6:02:37 PM com.hazelcast.core.LifecycleService
INFO: hz.client_0 [dev] [3.10.4] HazelcastClient 3.10.4 (20180727 - 0f51fcf) is STARTING
Sep 13, 2018 6:02:38 PM com.hazelcast.client.spi.ClientInvocationService
INFO: hz.client_0 [dev] [3.10.4] Running with 2 response threads
Sep 13, 2018 6:02:38 PM com.hazelcast.core.LifecycleService
INFO: hz.client_0 [dev] [3.10.4] HazelcastClient 3.10.4 (20180727 - 0f51fcf) is STARTED
Sep 13, 2018 6:02:38 PM com.hazelcast.client.connection.ClientConnectionManager
INFO: hz.client_0 [dev] [3.10.4] Trying to connect to [127.0.0.1]:5701 as owner member
Sep 13, 2018 6:02:38 PM com.hazelcast.client.connection.ClientConnectionManager
INFO: hz.client_0 [dev] [3.10.4] Setting ClientConnection{alive=true, connectionId=1, channel=NioChannel{/127.0.0.1:61191->/127.0.0.1:5701}, remoteEndpoint=[127.0.0.1]:5701, lastReadTime=2018-09-13 18:02:38.356, lastWriteTime=2018-09-13 18:02:38.352, closedTime=never, lastHeartbeatRequested=never, lastHeartbeatReceived=never, connected server version=3.10.4} as owner with principal ClientPrincipal{uuid='532bf500-e03e-4620-a9c2-14bb55c07166', ownerUuid='2fb66fa1-a17f-49fe-ba2b-bf585d43906d'}
Sep 13, 2018 6:02:38 PM com.hazelcast.client.connection.ClientConnectionManager
INFO: hz.client_0 [dev] [3.10.4] Authenticated with server [127.0.0.1]:5701, server version:3.10.4 Local address: /127.0.0.1:61191
Sep 13, 2018 6:02:38 PM com.hazelcast.client.spi.impl.ClientMembershipListener
INFO: hz.client_0 [dev] [3.10.4] 

Members [1] {
    Member [127.0.0.1]:5701 - 2fb66fa1-a17f-49fe-ba2b-bf585d43906d
}

Sep 13, 2018 6:02:38 PM com.hazelcast.core.LifecycleService
INFO: hz.client_0 [dev] [3.10.4] HazelcastClient 3.10.4 (20180727 - 0f51fcf) is CLIENT_CONNECTED
Sep 13, 2018 6:02:38 PM com.hazelcast.internal.diagnostics.Diagnostics
INFO: hz.client_0 [dev] [3.10.4] Diagnostics disabled. To enable add -Dhazelcast.diagnostics.enabled=true to the JVM arguments.

Однако любой объект, который извлекается и который вызывает Hazelcast, просто останавливается.

Я перезапустил Hazelcast с JAVA_OPTS, чтобы посмотреть, изменится ли он, не похоже:

docker run --name=hazelcast -d=true -p 5701:5701 -e JAVA_OPTS="-Dhazelcast.local.publicAddress=127.0.0.1:5701" hazelcast/hazelcast:3.10.4

Копание журналов Hazelcast с помощью:

docker logs -f hazelcast

Я вижу следующее:

 Sep 13, 2018 6:02:11 PM com.hazelcast.client.ClientEndpointManager
    INFO: [127.0.0.1]:5701 [dev] [3.10.4] Destroying ClientEndpoint{connection=Connection[id=2, /172.17.0.2:5701->/172.17.0.1:56514, endpoint=[172.17.0.1]:56514, alive=false, type=JAVA_CLIENT], principal='ClientPrincipal{uuid='d8a9b730-c5fd-458c-9ab6-671aece99305', ownerUuid='2fb66fa1-a17f-49fe-ba2b-bf585d43906d'}, ownerConnection=true, authenticated=true, clientVersion=3.10.4, creationTime=1536861657874, latest statistics=null}
    Sep 13, 2018 6:02:38 PM com.hazelcast.nio.tcp.TcpIpAcceptor
    INFO: [127.0.0.1]:5701 [dev] [3.10.4] Accepting socket connection from /172.17.0.1:56516
    Sep 13, 2018 6:02:38 PM com.hazelcast.nio.tcp.TcpIpConnectionManager
    INFO: [127.0.0.1]:5701 [dev] [3.10.4] Established socket connection between /172.17.0.2:5701 and /172.17.0.1:56516
    Sep 13, 2018 6:02:38 PM com.hazelcast.client.impl.protocol.task.AuthenticationMessageTask
    INFO: [127.0.0.1]:5701 [dev] [3.10.4] Received auth from Connection[id=3, /172.17.0.2:5701->/172.17.0.1:56516, endpoint=null, alive=true, type=JAVA_CLIENT], successfully authenticated, principal: ClientPrincipal{uuid='532bf500-e03e-4620-a9c2-14bb55c07166', ownerUuid='2fb66fa1-a17f-49fe-ba2b-bf585d43906d'}, owner connection: true, client version: 3.10.4
    Sep 13, 2018 6:03:11 PM com.hazelcast.transaction.TransactionManagerService
    INFO: [127.0.0.1]:5701 [dev] [3.10.4] Committing/rolling-back live transactions of client, UUID: d8a9b730-c5fd-458c-9ab6-671aece99305

При попадании в кеш:

Sep 13, 2018 6:05:43 PM com.hazelcast.map.impl.operation.EntryOperation
SEVERE: [127.0.0.1]:5701 [dev] [3.10.4] java.lang.ClassNotFoundException: org.hibernate.cache.spi.entry.StandardCacheEntryImpl
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: org.hibernate.cache.spi.entry.StandardCacheEntryImpl
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:86)
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:75)
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:269)
    at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:574)
    at com.hazelcast.hibernate.serialization.Value.readData(Value.java:78)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:160)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:106)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:51)
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:187)
    at com.hazelcast.query.impl.CachedQueryEntry.getValue(CachedQueryEntry.java:75)
    at com.hazelcast.hibernate.distributed.LockEntryProcessor.process(LockEntryProcessor.java:49)
    at com.hazelcast.hibernate.distributed.LockEntryProcessor.process(LockEntryProcessor.java:32)
    at com.hazelcast.map.impl.operation.EntryOperator.process(EntryOperator.java:319)
    at com.hazelcast.map.impl.operation.EntryOperator.operateOnKeyValueInternal(EntryOperator.java:182)
    at com.hazelcast.map.impl.operation.EntryOperator.operateOnKey(EntryOperator.java:167)
    at com.hazelcast.map.impl.operation.EntryOperation.runVanilla(EntryOperation.java:384)
    at com.hazelcast.map.impl.operation.EntryOperation.call(EntryOperation.java:188)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:202)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:191)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.run(OperationExecutorImpl.java:406)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.runOrExecute(OperationExecutorImpl.java:433)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvokeLocal(Invocation.java:581)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvoke(Invocation.java:566)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke0(Invocation.java:525)
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke(Invocation.java:215)
    at com.hazelcast.spi.impl.operationservice.impl.InvocationBuilderImpl.invoke(InvocationBuilderImpl.java:60)
    at com.hazelcast.client.impl.protocol.task.AbstractPartitionMessageTask.processMessage(AbstractPartitionMessageTask.java:67)
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.initializeAndProcessMessage(AbstractMessageTask.java:123)
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.doRun(AbstractMessageTask.java:111)
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.run(AbstractMessageTask.java:101)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:155)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:125)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:100)
Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.spi.entry.StandardCacheEntryImpl
    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:615)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1866)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1749)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2040)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:82)
    ... 34 more

Нужно ли включать какой-то JAR-файл в мою настройку Hazelcast Docker или что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Наконец-то все заработало, вот что нужно было:

1: Убедитесь, что у вас есть все эти три зависимости, изначально я пропустил первую, но по какой-то причине не получил исключение ClassNotFoundкак и ожидалось.Кажется, это не транзитивная зависимость hazelcast-client или hazelcast-hibernate52

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast</artifactId>
        <version>${hazelcast.version}</version>
    </dependency>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-hibernate52</artifactId>
        <version>${hazelcast-hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-client</artifactId>
        <version>${hazelcast.version}</version>
    </dependency>

2: если ваш экземпляр dev Hazelcast не имеет пароля, не указывайте пароль.127.0.0.1 работает нормально, не нужно запускаться на внешнем сервере во время разработки.

paramsDefault.add("hibernate.cache.use_query_cache=true")
paramsDefault.add("hibernate.cache.use_second_level_cache=true")
paramsDefault.add("hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory")
paramsDefault.add("hibernate.cache.hazelcast.use_native_client=true")
paramsDefault.add("hibernate.cache.hazelcast.native_client_address=127.0.0.1")
//  paramsDefault.add("hibernate.cache.hazelcast.native_client_group=$ENV")
//  paramsDefault.add("hibernate.cache.hazelcast.native_client_password=dev-pass")

3: избавиться от hazelcast.xml - после удаления этого файла hazelcast.xml Hibernate даже запустился дажехотя мой hazelcast.xml файл содержал только одну строчку, в которой было указано использование конфигурации по умолчанию.

4: убедитесь, что все объекты помечены как Serializable, в противном случае объекты не будут кэшироваться и вызывать исключение на сервере Hazelcast.сам по себе.

@Table
@Entity
@BatchSize(size = 50)
@PersistenceContext(unitName = "default")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "Tag")
class Tag(
    name: String,
) : Serializable {

5: Если ваша сущность имеет @OneToMany, @ManyToOne или другие сущности внутри нее, убедитесь, что эти сущности также Serializable.

6:Напишите небольшой сценарий, чтобы гарантировать, что ваши объекты кэшируются:

import com.hazelcast.client.HazelcastClient
import com.hazelcast.client.config.ClientConfig

fun main(args: Array<String>) {

    val config = ClientConfig()
    config.getNetworkConfig().addAddress("127.0.0.1:5701")
    val hazelcastInstance = HazelcastClient.newHazelcastClient(config)

    val map = hazelcastInstance.getMap<Any, Any>("Tag")

    println("=================")
    map.forEach { t, u ->
        println(" $t -> $u ")
    }
    println("=================")

    hazelcastInstance.shutdown()

}

Вышеуказанный сценарий будет println всех объектов тегов, находящихся в данный момент в кэше

7: при запуске экземпляра Docker,убедитесь, что вы выставили порт без опции -p, ничего не будет работать.

docker run --name=hazelcast -d=true -p 5701:5701 -e JAVA_OPTS="-Dhazelcast.local.publicAddress=127.0.0.1:5701" hazelcast/hazelcast:3.10.4

8: проверьте журналы Hazelcast, чтобы увидеть, подключается ли ваш клиент Java / Kotlin:

docker logs -f hazelcast

Вы должны увидеть что-то вроде этогокогда есть соединение:

Sep 13, 2018 9:05:06 PM com.hazelcast.client.ClientEndpointManager
INFO: [127.0.0.1]:5701 [dev] [3.10.4] Destroying ClientEndpoint{connection=Connection[id=32, /172.17.0.2:5701->/172.17.0.1:56574, endpoint=[172.17.0.1]:56574, alive=false, type=JAVA_CLIENT], principal='ClientPrincipal{uuid='99cbf1b4-d11c-462d-bd87-4c069bc9b2ef', ownerUuid='2fb66fa1-a17f-49fe-ba2b-bf585d43906d'}, ownerConnection=true, authenticated=true, clientVersion=3.10.4, creationTime=1536872631771, latest statistics=null}
Sep 13, 2018 9:05:19 PM com.hazelcast.nio.tcp.TcpIpAcceptor
INFO: [127.0.0.1]:5701 [dev] [3.10.4] Accepting socket connection from /172.17.0.1:56576
Sep 13, 2018 9:05:19 PM com.hazelcast.nio.tcp.TcpIpConnectionManager
INFO: [127.0.0.1]:5701 [dev] [3.10.4] Established socket connection between /172.17.0.2:5701 and /172.17.0.1:56576
Sep 13, 2018 9:05:19 PM com.hazelcast.client.impl.protocol.task.AuthenticationMessageTask
INFO: [127.0.0.1]:5701 [dev] [3.10.4] Received auth from Connection[id=33, /172.17.0.2:5701->/172.17.0.1:56576, endpoint=null, alive=true, type=JAVA_CLIENT], successfully authenticated, principal: ClientPrincipal{uuid='ff51de39-fd9c-4ecf-bdd4-bbdb6ec6c79e', ownerUuid='2fb66fa1-a17f-49fe-ba2b-bf585d43906d'}, owner connection: true, client version: 3.10.4

Похоже, что это суть работы спящего режима Hazelcast.

0 голосов
/ 13 сентября 2018

Похоже, вы пытаетесь использовать адрес обратной связи от другого сервера и вне сети докеров. Вы можете попробовать использовать мост для устранения трансляции сетевых адресов докера. Также, так как 0.0.0.0 связан, таким образом, все ip-адреса должны иметь прослушиватели Hazelcast. Я бы упростил и сначала проверил Hazelcast. Если у вас есть предприятие, то используйте консольное приложение, в противном случае напишите простой стартовый сервер java main. А затем попытайтесь соединиться с клиентом, используя реальный IP-адрес. Как только это сработает, перейдите в режим гибернации.

...