【问题标题】:Keep servlet context in Grails after container reboot容器重启后在 Grails 中保留 servlet 上下文
【发布时间】:2012-06-05 11:45:25
【问题描述】:

重新启动我的 tomcat 实例后,所有 servlet 上下文的属性都将丢失,尽管所有活动会话仍在运行,它们的属性仍在运行。使 servlet 上下文属性在容器重新启动后仍然存在的最好且最类似于 Grails 的方法是什么?

【问题讨论】:

  • 为了完全清楚,您能否指定您“重新启动”容器的方式?
  • 我最终要做的——通过一些弯路——是 'tomcat_base/bin/shutdown' 和 'tomcat_base/bin/startup'

标签: grails servlets reboot


【解决方案1】:

AFAIK 没有真正的 Grails'ish 方法可以做到这一点。按照标准 Servlet API,实现 ServletContextListener 并直接使用 web.xml 或通过 webxml plugin 注册它。

ServletContextListener 实现应该使用普通的 java 反序列化。

【讨论】:

  • 你的意思是我必须以某种方式手动contextDestroyed 期间保持上下文并在contextInitialized 上重新加载它?
  • @johanneslink 不要尝试持久化 ServletContext,没有办法恢复它。它不应该被持久化。
  • @Stefan ServletContextListener 应该“使用普通的 java 反序列化”做什么?
  • @Pidster 我正在跟踪 servletContext 中的所有活动会话。在 tomcat 重新启动后会话仍然处于活动状态,所以我也想知道它们。
  • 我并不是要保留 ServletContext 本身,而是通过 get/setAttribute() 保留属性
【解决方案2】:

ServletContext 不是持久的,也不是可分发的。它没有实现 Serializable。

http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html

Servlet 规范的第 4 章涉及 ServletContext,它确实描述了其中设置的属性将被持久化的任何期望。为此通常使用某种数据库。

【讨论】:

    【解决方案3】:

    是的,序列化 servlet 上下文属性不是一个好主意。

    Servlet context serializable attribute persistence 的帖子正是在谈论这个......

    servlet 容器突然终止的可能性不为零,而您的 web 应用程序没有机会保留其属性。

    您的 servlet 上下文中包含的属性应与您的 Web 应用程序完全分开处理,因为它们无法在容器重新启动时得到保证(而您的应用程序的属性可以在您认为合适的情况下保留)。

    【讨论】:

    • “您的应用程序的属性”到底是什么意思?
    • 无论您在 servlet 上下文中显式设置的任何属性都需要在应用程序的整个生命周期中显式持久化。因此,如果您在 servlet 上下文中设置属性“foo”,则在某些时候,您需要将“foo”的值保留到可以在容器重新启动时重新加载到 servlet 上下文中的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2016-01-13
    • 1970-01-01
    • 2012-12-29
    • 2021-04-19
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多