【问题标题】:Instantiate object when Tomcat startsTomcat启动时实例化对象
【发布时间】:2011-05-12 16:33:58
【问题描述】:

我部署了一个 Tomcat 服务器,它接收从传感器以 JSON 格式传输的观察结果。我还有一个传感器描述我想使用的本体。

但是,我想在服务器接收到任何传感器观察结果之前加载本体。如何在加载 Tomcat 后立即实例化对象?

【问题讨论】:

标签: java jsp tomcat ontology


【解决方案1】:

要在应用程序启动或停止时执行操作,您应该使用 ServletContextListener: http://download.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html

在 web.xml 中:

<web-app>
    ...
    <listener>
        <listener-class>com.example.Listener</listener-class>
    </listener>
    ...
</web-app>

与 Peter Knego 的提议相反,此解决方案可移植到任何 servlet 容器,而不仅限于 Tomcat。

【讨论】:

  • +1:这可能比我的 Servlet.init() 解决方案更干净,这取决于本体在概念上是属于在 servlet 类中还是仅仅是在它的生命周期中捎带。
【解决方案2】:

您可以使用event listeners,它会在加载 Web 应用程序 (contex) 时调用。在那里您初始化您的对象并将它们保存到ServletContext,在那里它们将可供您应用程序中的所有 servlet 使用。

实现ServletContextListener 并在其中放入contextInitialized()

contextInitialized(ServletContextEvent sce){

    // Create your objects
    Object myObject = ...

    sce.getServletContext().setAttribute("myObjectKey", myObject);
} 

然后在Tomcat context.xml中register the listener

<Context path="/examples" ...>
    ...
    <Listener className="com.mycompany.mypackage.MyListener" ... >
    ...
</Context>

【讨论】:

    【解决方案3】:

    我认为严格来说,您想要做的是在 您的 servlet 被 Tomcat 加载后立即实例化一个对象。 (为了特定于应用程序的功能而修改 Tomcat 本身并没有任何意义)。

    在这种情况下,您的Servlet 类可以覆盖/实现init(ServletConfig config) 方法。这在 servlet 初始化时由 servlet 容器(在本例中为 Tomcat)调用,并且正是执行静态启动逻辑的正确位置,例如您在此处所指的那种。

    事实上,在它的 init 方法返回之前,servlet 甚至无法接收连接,因此您可以保证在传感器观察到达之前本体将被完全加载。

    【讨论】:

    • 这看起来可行!但是,我现在遇到了本体问题。当我可以确认时会接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多