cod*_*ent 3 java tomcat openshift tomcat8 openshift-enterprise
我想将 Tomcat 的 HttpSession 持久保存到磁盘,以便可以在可扩展的云环境中使用它。关键是,将会有许多 Tomcat 节点(在云 PaaS 中),并且客户端可以定向到其中的任何一个。我们希望从共享磁盘单元保留并加载会话。
我已经这样配置了 PersistentManager:
上下文.xml
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore" directory="c:/somedir"/>
</Manager>
Run Code Online (Sandbox Code Playgroud)
问题是会话显然永远不会刷新到磁盘。
我更改了<Manager>
配置,添加了 maxIdleBackup:
<Manager className="org.apache.catalina.session.PersistentManager maxIdleBackup="1">
Run Code Online (Sandbox Code Playgroud)
这样,我大约需要一分钟才能看到会话持久保存到磁盘上。奇怪的是,该文档指出它应该需要大约一秒钟的时间:
maxIdleBackup:自上次访问会话到有资格保留到会话存储之前的时间间隔(以秒为单位),或 -1 以禁用此功能。默认情况下,此功能处于禁用状态。
其他配置:
按照文档我设置了系统属性
org.apache.catalina.session.StandardSession.ACTIVITY_CHECK -> true
Run Code Online (Sandbox Code Playgroud)
有没有办法立即将会话刷新到磁盘?是否可以使会话中的任何更改也立即保留?
更新:
我尝试强制钝化会话并使用 刷新到磁盘maxIdleBackup="0" minIdleSwap="0" maxIdleSwap="1"
,但仍然需要大约一分钟。
您还可以使用这个阀门,它是 Tomcat 发行版的一部分(至少在版本 8 中):
<Valve className="org.apache.catalina.valves.PersistentValve"/>
Run Code Online (Sandbox Code Playgroud)
该节点必须插入到文件<Manager className="org.apache.catalina.session.PersistentManager">
中的节点之前context.xml
。
然后它将使用存储来维护每个 http 请求的会话。请注意,文档假设同一客户端一次仅发出一个 http 请求。
这将允许您在 java ee 服务器前面使用非粘性会话负载平衡器。