走自己的路

路漫漫其修远兮,吾将上下而求索

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  50 随笔 :: 4 文章 :: 118 评论 :: 0 Trackbacks

现在我们项目几乎都是在servlet的init方法中初始化资源,在destroy方法里释放资源。servlet的load on startup是有先后顺序,但是没有依赖关系,如果某个servlet初始化出现异常,不会终止剩下的servlet的初始化,这样有时会使得web application正常启动,但是却部分可用,整个系统处于不稳定状态。这应该是一种不推荐的做法。
而servlet context listener是在所有servlet初始化之前被调用,同样在所有servlet destroy之前被调用。更关键的是,如果在contextInitialized抛出runtime异常,剩余的listener和所有servlet都不会初始化,解决了web application非正常启动的问题。

以下情况可以使用servlet来初始化资源:

     整个系统只有一个servlet会在系统启动时初始化资源
     Servlet初始化的资源是独立的,不会影响整个系统的正常运行
     Servlet初始化失败后,整个系统处于不可被访问状态
     Container的版本比较旧,不支持servlet2.3或者更新的版本

posted on 2009-08-05 12:52 叱咤红人 阅读(1682) 评论(3)  编辑  收藏 所属分类: JSP, Servlet and JSTL

评论

# re: 是用ServletContextListenser还是Servlet初始化资源 2009-08-06 09:25 隔叶黄莺
其实无所谓的。  回复  更多评论
  

# re: 是用ServletContextListenser还是Servlet初始化资源[未登录] 2009-08-06 10:16 boboism
恩 在大部分情况下还是listeners比较好,启动顺序大部分都是在Servlet之前,但是听说在WebSphere 8 上面好像是Servlet的初始化比listener早  回复  更多评论
  

# re: 是用ServletContextListenser还是Servlet初始化资源 2009-08-06 11:43 ldd600
@隔叶黄莺
还是有所谓的吧。有这样一个case:
servletOne parse配置
servletTwo 启动queue message listener

现在servletOne启动失败,但是servletTwo启动成功,这时它就会到queue里把消息收下来,但是处理肯定是会失败的。

解决方法:将message listener改为MDB, 将message listener改为用JMX启动,这些解决方法都比较复杂。

如果初始化失败要求整个application都不能启动起来,最好还是使用context listener的方式吧?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: