Получение Hazelcast Native Client, работающего с Hibernate 5.2.x

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

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

Super Client is a member of the cluster, it has socket connection to every member in the cluster and it knows where the data is so it will get to the data much faster. But Super Client has the clustering overhead and it must be on the same data center even on the same RAC. However Native client is not member and relies on one of the cluster members. Native Clients can be anywhere in the LAN or WAN. It scales much better and overhead is quite less. So if your clients are less than Hazelcast nodes then Super client can be an option; otherwise definitely try Native Client. As a rule of thumb: Try Native client first, if it doesn't perform well enough for you, then consider Super 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

В документации docker hub также упоминается, как передать 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>

В документах есть следующие ссылки:

Получение Hazelcast Native Client, работающего с Hibernate 5.2.x

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

Получение Hazelcast Native Client, работающего с Hibernate 5.2.x

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

Получение Hazelcast Native Client, работающего с Hibernate 5.2.x

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

<!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=true hibernate.cache.hazelcast.native_client_address=127.0.0.1 hibernate.cache.hazelcast.native_client_group=dev hibernate.cache.hazelcast.native_client_password=dev-pass

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:

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>

Поддерживается ли спящий режим 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()

}

Чтобы доказать, что он хранит и извлекает из кеша, я перезапускаю основной метод несколько раз, и каждый раз количество записей в 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, или что здесь происходит?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
757
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Привет, Терри, я обновил свой вопрос с помощью фрагмента кода, который успешно подключается к Hazelcast, сохраняет данные и снова извлекает их после перезапуска приложения, что означает, что Hazelcast работает правильно (все вышеперечисленное - это я пытаюсь заставить Hazelcast + Hibernate работать над моя машина разработчика)

Jan Vladimir Mostert 13.09.2018 18:13

Достигая прогресса, сам Hazelcast сейчас терпит неудачу, похоже, что отсутствует класс или что-то в этом роде.

Jan Vladimir Mostert 13.09.2018 20:09

Если вы запустите docker pull hazelcast/hazelcast:3.10.4, это будет основной сервер Hazelcast с hazelcast.jar и hazelcast.xml (так что имя группы «dev» пароль «dev-pass»). Он не будет содержать jar-файл Hibernate, который является исключением. предлагает должны присутствовать на стороне сервера.

Neil Stevenson 13.09.2018 22:30
Ответ принят как подходящий

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

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: Если у вашего экземпляра 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

Похоже, в этом и заключается суть в том, чтобы заставить работать Hibernate Hibernate.

Привет, Ян. Просто случайно: вы пытались интегрировать это в веб-приложение и развернуть на Tomcat? Я пробую github.com/lurodrig/hazle-demo, но мне что-то не хватает. Возможно, он заслуживает еще одного вопроса и связать его с вашим

Gaucho 18.05.2020 09:18

Наверное, лучше задать это другим вопросом. Я не использовал Tomcat / Jetty в течение многих лет, строил все как толстые банки, и вполне вероятно, что Tomcat также может мешать в зависимости от вашей настройки, особенно если это настройка TomcatEE.

Jan Vladimir Mostert 18.05.2020 12:52

Другие вопросы по теме