最近公司有一个需要,要求在网站启动的时候需要先判断程序的版本,如果版本不匹配则退出启动,也就是说要通过程序来停止这个项目的启动,我只知道.net的ServiceController组件有这个功能,但java里哪个类有相同的作用呢,请高手指教。

解决方案 »

  1.   

    这个应该跟容器有关,程序貌似没法控制的吧。
    .net那个应该是调用了容器的方法
      

  2.   

    办法不好想,如果tomcat可以调用Lifecycle的stop方法,但不知道这会不会跟容器有关,所以现在采用抛异常的方式来停止它。谢谢各位了!
      

  3.   

     // Tomcat 重启动
      try {
      //1 获得Server
      Class server = Class.forName("org.apache.catalina.ServerFactory");
      Method getServer = server.getDeclaredMethod("getServer", new Class[0]);  
      Object obj = getServer.invoke(server, new Object[0]);
      
      //2 获得Services
      Method findServices = obj.getClass().getDeclaredMethod("findServices",new Class[0]);
      Object[] objs = (Object[])findServices.invoke(obj, new Object[0]);
      for (int i = 0; i < objs.length; i++) {
       Method getContainer = objs[i].getClass().getMethod("getContainer", new Class[0]);
       Object container = getContainer.invoke(objs[i], new Object[0]);
       Method findChildren = container.getClass().getMethod("findChildren", new Class[0]);
       
       Object[] containers = (Object[])findChildren.invoke(container, new Object[0]);  
       // 3.这里是要重启动的系统的名称如/systemXXX
       Object[] objss = {"/xxxx"};
       Class[] cls = {java.lang.String.class};
       for (int j = 0; j < containers.length; j++) {
        Method temp = containers[j].getClass().getMethod("findChild", cls);
        Object abmApp = temp.invoke(containers[j], objss);
        if (abmApp != null) {
         //可以为stop,reload
         Method relaod = abmApp.getClass().getMethod("reload", new Class[0]);
         relaod.invoke(abmApp, new Object[0]);
        }
       }   
      }
      } catch (Exception e) {
       e.printStackTrace();
      } 我自己还没试,楼主自己试试看。这是调用了tomcat的jar
      

  4.   

    如果你只想自己应用不生效,你可以写一个类实现ServletContextListener,然后在web.xml中增加
    <listener>
    <listener-class>
    mypack.mylistener
    </listener-class>
    </listener>
    然后在这个类中判断是否允许启动,如果不允许则抛出RuntimeException异常,Web服务器会认为这个应用不可用的