【问题标题】:tomcat deploy war without losing sessiontomcat部署战争而不丢失会话
【发布时间】:2015-03-12 09:11:27
【问题描述】:

我正在从事 Java Web 应用程序部署。我有一个要求,比如我们将继续在 tomcat 应用程序中部署新版本的 war 文件。我的要求是当用户登录时,当我在 tomcat Web 应用程序中部署新战争时,它会覆盖旧战争并且我失去会话。

我应该在不丢失会话的情况下向用户展示新版本。

当我用谷歌搜索时,我开始了解 tomcat 并行部署。但是我的经理要求不遵循该解决方案,并要求查看是否有任何其他解决方案可用。但我没有得到任何其他解决方案。

tomcat 有没有办法存储会话?

jboss、weblogic 或 websphere 等其他服务器呢?

【问题讨论】:

  • 不确定,但也许您可以在关机时序列化会话并在启动时再次加载它?我认为也许 apache wicket 和 spring mvc 支持这一点。但这需要您的会话对象可序列化
  • 搜索持久会话。
  • 这可能会对您有所帮助 - Persistence_Across_Restarts。正如您注意到的那样,完整的 Java EE 服务器通常通过持久会话来支持这一点,例如 WebSphere
  • 另一个想法,存储会话并使用监听器来检测何时部署/取消部署战争example here

标签: java jakarta-ee tomcat7


【解决方案1】:

你熟悉 Redis 吗?它是一个开源(BSD 许可)的内存数据结构存储,用作数据库、缓存和消息代理。

使用 Redisson java 客户端,你可以配置 RedissonSessionManager,它将所有 Tomcat 的 session 数据持久化在 Redis 中。

这样,如果您重新启动 Tomcat 实例,它会在启动后从 Redis 恢复会话。

这种方法还有一个额外的优势,它是一种在不同 Tomcat 实例之间共享会话数据的非常方便的方法,允许您将它们集群在负载均衡器后面而没有会话粘性(如 nginx)。

您可以在此处阅读有关使用 RedissonSessionManager 配置 tomcat 的更多信息:

https://dzone.com/articles/redis-based-tomcat-session-management

祝你好运!

【讨论】:

    【解决方案2】:

    正如 Gas 所说,请参阅 http://tomcat.apache.org/tomcat-7.0-doc/config/manager.html#Persistence_Across_Restarts

    用一些明确的路径名配置<Manager>。默认情况下,会话存储在 Web 应用程序的工作目录中。卸载 Web 应用程序时会删除工作目录。

    如果您将pathname 属性显式配置为指向某个在取消部署时未删除的目录,则会话将继续存在。

    请注意,您可以在配置中使用 ${catalina.base} 和其他系统属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 2012-04-14
      • 2015-08-31
      • 2018-08-30
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2018-04-08
      相关资源
      最近更新 更多