2 回答
TA贡献1876条经验 获得超7个赞
看起来您正在尝试使用来自另一个服务器和 docker 网络之外的环回地址。您可能想尝试桥接以消除 docker 网络地址转换。此外,由于 0.0.0.0 已绑定,因此所有 IP 地址都应安装 Hazelcast 侦听器。我会简化并首先验证 Hazelcast。如果您有企业,则使用控制台应用程序,否则编写一个简单的启动服务器 java main。然后尝试使用真实 IP 地址与客户端连接。一旦这有效,然后就可以进行休眠配置。
TA贡献1828条经验 获得超6个赞
终于让它工作了,这是需要的:
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文件后,即使我的hazelcast.xml文件中只有一行写着使用默认配置,Hibernate 也确实启动了。
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当前缓存中的所有 Tag 实体
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 hibernate 工作的关键。
添加回答
举报