Pivotal GemFire 多会话的春季会议



我们正在尝试为零售商提供跨服务器的非粘性会话解决方案。 使用的服务器是WebLogic 12.2.1.3和TomcatEE 7.0.5。我们能够看到跨服务器保留的会话。

httpServletRequest.getSession()有时会尝试从容器而不是 GemFire 中检索会话。

此外,我们在客户端 cookie 和服务器日志中看到的会话 ID 与 GemFire 内部看到的 ID 不同。 这是意料之中的吗?

编辑: 在 GemFire 中创建的会话 ID 在客户端浏览器上采用 base64 编码。这将回答上述问题。

确保您已在 WebLogic 和 TomcatEE 上部署的所有(Spring Boot(应用程序实例中为Pivotal GemFire "启用"春季会话。 这很简单,如下所示:

@SpringBootApplication
@EnableGemFireHttpSession
class MySpringBootWebApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
...
}

@EnableGemFireHttpSession是关键。 还要确保部署在每个 WebLogic 和 TomcatEE 中的应用程序实例在后端 Pivotal GemFire 集群中共享同一区域,假设有一个 GemFire 集群同时为 WebLogic 和 TomcatEE 中的应用程序提供服务。

例如,如果您显式设置区域,请使用:

@EnableGemFireHttpSession(regionName = "MySessionRegion")

确保所有应用程序实例使用相同的区域名称(即"MySessionRegion"(。 或者,从SSDG 2.0.5.RELEASE起,可以使用 Spring Bootapplication.properties文件中的属性配置区域名称:

spring.session.data.gemfire.session.region.name=MySessionRegion

此外,请确保所有应用程序都配置为与同一 GemFire 集群通信。 这取决于春季会话区域用于与 GemFire 集群通信的Pool。 池名称可通过注释进行配置,如下所示:

@EnableGemFireHttpSession(..., poolName = "SessionPool")

然后,您必须为所有应用程序实例配置池以连接到同一 GemFire 集群,最好使用定位符,如下所示:

@Configuration 类 MyGemFireConfiguration {

@Bean("SessionPool")
PoolFactoryBean sessionPool() {
PoolFactoryBean sessionPool = new PoolFactoryBean();
sessionPool.setName("SessionPool");
sessionPool.setLocators(Arrays.asList(new ConnectionEndpoint("host1", port1),
new ConnectionEndpoint("host2", port2),
...,
new ConnectionEndpoint("hostN", portN));
return sessionPool;
}
...

}

或者,您可以配置"默认"GemFire 池,假设已配置的客户端 PROXY 区域存储会话状态使用"默认"池,当没有显式配置/命名池时,它将配置"默认"池。 例如。

最后要注意的是,如果您使用的是 GemFire WAN 拓扑,则有多个站点,其中每个站点都提供由应用程序服务器隔离的特定应用程序集合,也许(即 WebLogic 与 TomcatEE(。 然后,您必须确保已配置适当的 GemFire 广域网,以便在多个 GemFire 集群之间进行协调。 这超出了这个答案的范围,所以我鼓励你看看这个。

随意分享您拥有的任何示例代码、配置和/或测试,这些代码、配置和/或测试可能会阐明您遇到的问题。

最新更新