我使用 glassfish 来运行webapp。我使用netbeans。
我的webapp需要很长的初始化。
我在 ServletContextListener.contextInitialized 方法中写道。
我在代码中添加了一些日志。
如果我在contextInitialized方法中编写我的初始化代码,在我看来,init被某人打断:日志停止片刻,我不明白为什么。
如果我在子线程中编写代码,则根本没有日志。
在webapp中执行long init的最佳方法是什么?
感谢。
答案 0 :(得分:1)
ServeletContextListener是比servlet init更好的地方。由于某种原因(资源短缺或内存管理问题)容器会破坏servlet并重新创建,然后这可能会破坏同一应用程序内其他servlet的数据。
尝试调查停止的原因并按原样保留ServletContextListner
答案 1 :(得分:0)
一个选项是拥有一个servlet load-on-startup
。在启动时加载servlet,如下所示
<web-app>
<servlet>
<servlet-name>InitProcess</servlet-name>
<servlet-class>com.my.ServletName</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
servlet将在启动时加载init()
,Servlet的方法将由容器调用。你可以在那里找到你的代码。
<load-on-startup>
中的数字决定了加载servlet的顺序。见here。这至少得到了Tomcat和Weblogic的支持。
要获取ServletContext,请使用:
ServletContext ctx = getServletContext();