学习probe的一点总结和应用

学习probe的一点总结和应用

大家在看文章之前先帮我看个问题(已解决 详细):
reload几次之后tomcat就挂了,我说的挂了,是指java进程占了CPU的几乎全部,整个电脑像死机一样,狂慢。
一年半前的一个项目也是使用的struts,hibernate,spring,没有这个现象,记不起是从什么时候开始的了。
以前也就忍了,但现在给客户做了一个tomcat的管理工具(因为需要和项目中的一些内容结合在一起所以单独做的),发布几次tomcat就挂了,导致这个工具意义变的不大了。


对tomcat进行管理

    研究了一下probe,了解到了一些基本的知识,现在准备,自己做tomcat的管理了。我是说这个项目中需要的对tomcat的那些管理功能,并不是完整的管理。
    tomcat里对容器资源是层层管理的,Servlet由Wrapper管理,Wrapper之上是Context(对应一个application, server.xml里的一个Context配置),再上是Host,再上是Engine。到了Host使用findChildren可以获取所有的 Context。Wrapper,Context,Host,Engine,都是继承Container的接口,tomcat里的实现类 (StandardXXX),又都是继承抽象类ContainerBase的,而ContainerBase又实现了Container, Lifecycle, Pipeline, MBeanRegistration, Serializable这些接口,所以当你获取到这些容器类的实例后可以根据你的需要将之转换为上述这些类型,进而获取其他的相关信息和执行特定的操作。具体情况可以参考
http://zhangjunhd.blog.51cto.com/113473/19865
http://tomcat.apache.org/tomcat-5.5-doc/architecture/index.html
http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/index.html

    要获取这些容器实例,一个方法是获取到Wrapper,然后进而获取其上级容器。就现在我了解到的情况,将一个servlet实现 org.apache.catalina.ContainerServlet接口就可以获取到一个 org.apache.catalina.Wrapper对象了,其他的方法我还不知道,我想应该存在一些更直接的获取Host对象之类的方法,抽时间看看tomcat本身的管理功能的代码。
    为了利用起原来的框架,并且纳入对tomcat信息的管理,我现在分别做了两个处理:

  1. 给Action注入Wrapper对象。
    我现在的策略是写一个TomcatManagerServlet实现ContainerServlet,获取Wrapper,然后将之保存到request的attribute里,然后forward到当前管理系统框架下的相应的action里。
    具体的方法是:在web.xml里配置这个servelt,并且指明所有的*.d会到这个servlet里来,然后到了这个servlet里后保存 Wrapper,然后forward到request.getRequestURI()+"o"。这样原来的页面里只要把链接地址从xxx.do改为 xxx.d就可以了。本来以为这个方法满好的,不过如果不是.do的请求就玩不起来了。现在觉着应该是在原有的链接之前加上一个额外路径更合适些,比如原来是/xxx/yyy.do,现在写成/tomcatManager/xxx/yyy.do,然后在TomcatManagerServlet里去除路径中的/tomcatManager再进行forward。这样下面的jsonrpc的servlet也不用修改了,但jsonrpc的前台要修改。终极一点是写一个servlet处理所有的请求,如果路径中含有/tomcatManager或者参数中含有tomcatManager,就给request里添加Wrapper对象。
  2. 给jsonrpc调用的对象注入Wrapper。
    上面这个方法其实我还没真正用,因为实际开发的时候我是使用ajax来操作的。方法类似,首先还是要把jsonrpc的servlet实现ContainerServlet接口,获取Wrapper,存入request的 attribute。如果被调用的方法定义了request参数,那么就可以从中获取Wrapper对象了。但这样比较繁琐,我写了一个 WebServerManager(今后会抽象为接口),定义了public void setWrapper(Wrapper wrapper)方法,然后写了一个jsonrpc的callback,并注册给jsonrpc,在callback里将Wrapper注入给 WebServerManager。这样WebServerManager就更通用和简洁一些了。
     
    上面只是说了tomcat的Container的基本内容,以及如何将获取Wrapper进而获取整个Container的方法。另外和我们自己的基础代码比较相关,所以你若要具体了解如何使用这些 Container对tomcat进行操作可以去查看probe的 org.jstripe.tomcat.probe.Tomcat55ContainerAdaptor及其父类和 org.jstripe.tomcat.probe.tools.ApplicationUtils,我觉着这两个类比较基础。理解了这两个类,就可以方便的进一步了解了。

你可能感兴趣的:(学习probe的一点总结和应用)