在 WildFly 中的重新部署之间保持 HTTP 会话

Posted

技术标签:

【中文标题】在 WildFly 中的重新部署之间保持 HTTP 会话【英文标题】:Keeping HTTP session between redeploys in WildFly 【发布时间】:2015-02-18 14:27:59 【问题描述】:

是否可以在 WildFly 上的重新部署之间保持 HTTP 会话?

【问题讨论】:

我认为是,但我认为您必须使用数据库持久会话。 【参考方案1】:

web.xml 中的<distributable/> 部署到独立 可能会将您引导至WFLY-3715(被低级异常污染的日志)。

替代选项可以是配置持久会话 in standalone.xml 或使用 jboss-cli.sh。 JBoss CLI 命令值得一提,因为它可以在 WildFly 的 maven 插件中使用。

/subsystem=undertow/servlet-container=default/setting=persistent-sessions:add(path="session", relative-to="jboss.server.temp.dir")

日志污染示例:

2016-12-29 09:39:48,464 错误 [io.undertow.request](默认任务 26)UT005023:对 /resources/js/holder.js 的异常处理请求:org.infinispan.util.concurrent。 TimeoutException:ISPN000299:15 秒后无法获取密钥 SessionCreationMetaDataKey(EkmgBEYcvqFxNF_T2dDwEfyXkh7Nzcv2nTKBYy9G) 和请求者 GlobalTransaction::13:local 的锁定。锁由 GlobalTransaction::12:local 持有
        在 org.infinispan.util.concurrent.locks.impl.DefaultLockManager$KeyAwareExtendedLockPromise.lock(DefaultLockManager.java:238)
        在 org.infinispan.interceptors.locking.AbstractLockingInterceptor.lockAndRecord(AbstractLockingInterceptor.java:193)
        在 org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.checkPendingAndLockKey(AbstractTxLockingInterceptor.java:193)
        在 org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.lockOrRegisterBackupLock(AbstractTxLockingInterceptor.java:116)
        在 org.infinispan.interceptors.locking.PessimisticLockingInterceptor.visitDataReadCommand(PessimisticLockingInterceptor.java:71)
        在 org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitGetKeyValueCommand(AbstractLockingInterceptor.java:80)
        在 org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:43)
        在 org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
        在 org.infinispan.interceptors.TxInterceptor.enlistReadAndInvokeNext(TxInterceptor.java:346)
        在 org.infinispan.interceptors.TxInterceptor.visitGetKeyValueCommand(TxInterceptor.java:331)
        在 org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:43)
        在 org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
        在 org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:114)
        在 org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:83)
        在 org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
        在 org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:43)
...........

【讨论】:

【参考方案2】:

您可以尝试配置会话持久性。 Here 是一个关于如何做的博客。

<servlet-container name="default">
    <persistent-sessions path="session" relative-to="jboss.server.temp.dir"/>
    <jsp-config/>
</servlet-container>

但是,似乎从 v8.2 开始可以使用此功能。我将引用此博客中的注释

当您使用非 ha 配置文件时,您还可以通过将 &lt;distributable/&gt; 添加到您的 web.xml 来实现会话钝化(适用于使用 WildFly 8.1.0 或更低版本的用户)。

【讨论】:

非常感谢! &lt;distributable/&gt; 就像 WildFly 8.1 的魅力。我也会尝试 WildFly 8.2 的解决方案。 太好了,很高兴它有帮助。 我要将所有会话变量类设置为“实现可序列化” 似乎可分发属性必须在 web.xml 中才能使持久会话工作。将 Wildfly 16 和 Keycloak 5 与 Elytron 一起使用。认为可分发仅适用于域/集群设置,但显然它也适用于独立设置。注意:单服务器模式(非集群)上的会话持久性在 GlassFish 中工作,无需分发...

以上是关于在 WildFly 中的重新部署之间保持 HTTP 会话的主要内容,如果未能解决你的问题,请参考以下文章

在 Wildfly 8.2 上重新部署后从 Infinispan 缓存读取时发生 ClassCastException

Spring Boot 2 重新部署到 Wildfly 10 后无法刷新 JMS 连接

在 WildFly 上重新部署后,CDI 无法在 @Requestscoped REST 服务中将 @Singleton 设置为 @Provider

在 Wildfly/Jboss 中部署 ear 期间如何防止 HTTP 404

如何列出 Wildfly 部署的 http servlet

Wildfly 10 通过 http 管理 api 列出所有部署的战争工件