我回到了一个@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 会话示例)。这将允许您将会话Region
Pool
"名称"配置。
另请注意,如果在使用 SDG
@EnableClusterDefinedRegions
时从集群中下来的内容,并且从集群拉下的Region
定义在服务器端使用此属性以不同的方式命名,则可以更改客户端使用的会话Region
的名称。
此外,您还可以使用属性配置客户端会话Region
数据策略(例如)。
关于您在日志中看到的过期"信息"消息...
由于客户端会话Region
默认是PROXY
,因此过期、逐出和其他Region
数据管理策略(例如压缩等)实际上没有多大意义。
事实上,SSDG 对于是否在本地应用其他Region
数据管理策略是明智的(请参阅此处,特别是此逻辑)。
您在应用程序日志中看到的消息实际上来自 SSDG。此消息实际上提醒您,会话状态管理实际上是在服务器端"托管"的(当应用程序客户端使用PROXY
甚至CACHING_PROXY
Region
时),并且相应的服务器端或集群会话Region
应手动和适当地配置,并在必要时使用过期策略以及其他内容。否则,实际上不会发生会话过期!
我希望这一切都能从那以后。
如果问题仍然存在,请随时提交问题票证,并提供复制问题的示例测试或小型应用程序。