Spring 数据 Geode 池在应用程序上下文中不能解析为池



我回到了一个@SpringBootApplication项目,该项目将spring-geode-starter与版本1.2.4一起使用,尽管升级到1.5.6版本时会发生相同的错误。

它使用

@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$3: 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),这是一个很好的选择(谢谢),那么您可以简单地在@SpringBootApplication类路径上包含spring-geode-starter-session依赖项,这样就不需要使用 SSDG 的@EnableGemFireHttpSession注释显式注释Spring Boot应用程序。

有关更多详细信息,请参阅此处。我还有一个示例应用程序,演示了 SSDG 的使用,在这里。可以在此处找到此示例的指南和源代码以及其他示例)。

此外,我通常建议用户从应用程序驱动 GemFire/Geode 群集配置,而不是让群集决定客户端获得的Regions(和/或其他组件/配置)。但是,SDG 提供了@EnableClusterDefinedRegions注释,在您无法控制应用程序正在使用的 GemFire/Geode 集群的情况下,该注释通常很有用。尽管如此,在(HTTP)会话UC中,GemFire/Geode集群无论如何都需要一个会话Region(默认为">ClusteredSpringSessions",由Spring Session for Apache Geode(SSDG)本身确定)。

好了,现在谈谈手头的问题...

我认为这里发生的事情是,由于向后兼容性和遗留原因,Apache Geode (SDG) 的 Spring 数据,SSDG 和 SBDG 都基于该数据;SBDG 还引入了 SSDG,以"gemfirePool"的名称定义了 GemFire/GeodePool,特别是在使用 SDG XML 空间和使用/定义数据源配置时。

因此,有点天真地假设用户会显式定义一个Pool并将其称为"gemfirePool",而不是简单地依赖于与 GemFire/Geode 缓存服务器的"默认"Pool连接(即"本地主机"、40404,或者如果使用定位器(推荐)、"本地主机"和10334)。

但是,出于开发目的,特别是在 SBDG 中,我依赖于这样一个事实,即 GemFire/Geode 无论如何都会创建一个"默认"Pool(当没有定义明确的Pool时),并放弃了"gemfirePool"应该存在的严格要求。但是,SBDG建立在SSDG和SDG的基础上,他们仍然依赖于传统安排(例如)。

我已经在 SSDG 中提交了发行票证以改变这一点,并更好地使 SSDG 与 SBDG 未来的偏好保持一致,但我还没有解决这个问题。对于给您带来的不便,我深表歉意。

无论如何,这是一个简单的更改,您可以从Spring Boot应用程序进行外部更改,application.properties这样(请参阅我从上面的 SBDG 引用的 HTTP 会话示例)。这将允许您将会话RegionPool"名称"配置。

另请注意,如果在使用 SDG@EnableClusterDefinedRegions时从集群中下来的内容,并且从集群拉下的Region定义在服务器端使用此属性以不同的方式命名,则可以更改客户端使用的会话Region的名称。

此外,您还可以使用属性配置客户端会话Region数据策略(例如)。

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

由于客户端会话Region默认是PROXY,因此过期、逐出和其他Region数据管理策略(例如压缩等)实际上没有多大意义。

事实上,SSDG 对于是否在本地应用其他Region数据管理策略是明智的(请参阅此处,特别是此逻辑)。

您在应用程序日志中看到的消息实际上来自 SSDG。此消息实际上提醒您,会话状态管理实际上是在服务器端"托管"的(当应用程序客户端使用PROXY甚至CACHING_PROXYRegion时),并且相应的服务器端或集群会话Region应手动和适当地配置,并在必要时使用过期策略以及其他内容。否则,实际上不会发生会话过期!

我希望这一切都能从那以后。

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

最新更新