spring 数据 geode 池在应用程序上下文中不可解析为池

spring data geode pool is not resolvable as a Pool in the application context

我回到了一个 @SpringBootApplication 项目,该项目使用 spring-geode-starter1.2.4 版本,尽管升级到 1.5.6 版本时会发生同样的错误。

它使用

设置一个 Geode 客户端
@Component
@EnableClusterDefinedRegions(clientRegionShortcut=ClientRegionShortcut.PROXY)

并且为了通过 HTTP 注册兴趣订阅,还

@Configuration
@EnableGemFireHttpSession

有一颗豆子

@Bean
public ReactiveSessionRepository<?> reactiveSessionRepository() {
    return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
}

启动应用程序时,spring 数据 geode 客户端连接到服务器(Geode 版本 1.14)并自动将 regions 复制回客户端,这很棒。

但是,在复制完所有区域句柄后,@EnableGemFireHttpSession 出现错误,即

Error creating bean with name 'ClusteredSpringSessions' defined in class path resource [org/springframework/session/data/gemfire/config/annotation/web/http/GemFireHttpSessionConfiguration.class][gemfirePool] is not resolvable as a Pool in the application context

日志中的第一条信息消息是:

org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration 1109 sessionRegionAttributes: Expiration is not allowed on Regions with a data management policy of PROXY
org.springframework.data.gemfire.support.AbstractFactoryBeanSupport 277 lambda$logInfo: Falling back to creating Region [ClusteredSpringSessions] in Cache [Web]

所以客户端正在尝试创建一个区域 ClusteredSpringSessions 但它不能。如果我为 HTTP 定义一个连接池,使用这样的池连接 bean

,问题似乎会自行解决
@Configuration
@EnableGemFireHttpSession(poolName="devPool")
public class SessionConfig {

@Bean
public ReactiveSessionRepository<?> reactiveSessionRepository() {
    return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
}

@Bean("devPool")
PoolFactoryBean sessionPool() {
    PoolFactoryBean pool = new PoolFactoryBean();
    ConnectionEndpoint ce = new ConnectionEndpoint("1.2.3.4", 10334);       
    pool.setSubscriptionEnabled(true);
    pool.addLocators(ce);
    return pool;
} 

}

日志中仍然存在 Expiration is not allowed on Regions with a data management policy of PROXY 信息消息,但这次 Falling back to creating Region [ClusteredSpringSessions] in Cache [Web] 似乎起作用了。

我不明白为什么默认池无法连接。

如果在版本 1.2.4 中定义了池,则可能会导致

由于您使用的是 Spring Boot for Apache Geode (SBDG),这是一个很好的选择(谢谢),那么你可以简单地包含 spring-geode-starter-session 对你的 @SpringBootApplication 类路径的依赖,这样就无需使用 SSDG 显式注释你的 Spring Boot 应用程序@EnableGemFireHttpSession 注释。

See here for more details. I also have a Sample application demonstrating the use of SSDG, here. The guide and source code for this example, along with other examples, can be found here).

此外,我通常会建议用户从应用程序驱动 GemFire/Geode 集群配置,而不是让集群决定 Regions(and/or 其他 components/configuration)客户得到。但是,提供了 SDG 的 @EnableClusterDefinedRegions 注释,在您无法控制应用程序正在使用的 GemFire/Geode 集群的情况下通常很有用。不过,在 (HTTP) Session UC 中,GemFire/Geode 集群需要一个 Session Region(默认为“ClusteredSpringSessions" as determined by Spring Session for Apache Geode (SSDG) 本身)无论如何。

好的,现在解决手头的问题...

我认为这里发生的事情是,由于向后兼容性和遗留原因,Spring Apache Geode (SDG) 的数据,SSDG 和 SBDG 都在其上基于; SBDG 还引入了 SSDG,定义了一个名为“gemfirePool”的 GemFire/Geode Pool,特别是在使用 SDG XML space 和 using/defining 时DataSource configuration.

因此,有些天真地假设用户会显式定义 Pool 并将其称为“gemfirePool”,而不是简单地依赖与 [=102] 的“默认”Pool 连接=]缓存服务器(即“localhost”,40404,或者如果使用定位器(推荐),“localhost”和10334)。

但是,出于开发目的,特别是在 SBDG 中,我依赖于 GemFire/Geode 创建“默认值”Pool 的事实(当没有明确定义 Pool 时) ,并放弃“gemfirePool”应该存在的严格要求。但是,SBDG 建立在 SSDG 和 SDG 的基础上,它们仍然依赖于遗留安排(example)。

我已经在 SSDG 中提交了一个 Issue ticket 来改变这一点,并更好地使 SSDG 与 SBDG 更喜欢的未来保持一致,但我只是还没有开始考虑它。对于给您带来的不便,我深表歉意。

无论如何,这是一个简单的更改,您可以从 Spring Boot 应用程序外部进行,在 application.properties 中像这样(请参阅 here 来自上面 SBDG 引用的 HTTP 会话示例)。这将允许您配置 Session Region Pool "name".

Also note, it is possible to change the name of the Session Region used by the client if what comes down from the cluster when you are using SDG's @EnableClusterDefinedRegions and the Region definition pulled down from the cluster is named differently on the server-side using this property.

此外,您还可以使用属性配置客户端 Session Region 数据策略(对于 example)。

关于您在日志中看到的过期“信息”消息...

由于客户端 Session Region 默认是一个 PROXY,那么 Expiration、Eviction 和其他 Region 数据管理策略(例如压缩等)实际上没有多大意义。

事实上,SSDG 很聪明地决定是否在本地应用额外的 Region 数据管理策略(参见 here, and specifically, this logic)。

您在应用程序日志中看到的消息实际上是 coming from SSDG。此消息实际上是在提醒您,您的会话状态管理实际上是在服务器端“管理”的(当应用程序客户端为此使用 PROXY 甚至 CACHING_PROXY Region matter) 并且相应的服务器端或集群 Sessions Region 应该手动和适当地配置,如有必要,使用过期策略和其他东西。否则,实际上不会发生 Session 过期!

我希望这一切都是因为。

如果问题仍然存在,请随时提交 Issue ticket 并提供示例测试或小型应用程序来复制您的问题。