Jetty之AbstractHandler

来源:互联网 发布:知乎周刊plus网盘 编辑:程序博客网 时间:2024/06/05 00:20

因为要弄清楚Java Web那一套东西,所以就要弄懂整个servlet定义的一些东西,那么就需要搞清楚servlet的容器是怎么搞的,其实最出名的servlet容器应该是tomcat吧,不过我准备拿jetty的源码开刀,因为它更轻量。。。

这篇文章来看看AbstractHandler的定义吧,因为jetty可以说是面向handler的服务器,这一点课netty很相似。。。先来看看它的继承体系:



在jetty中也有lifecycle的概念,它用于维护组件的状态,组件的启动,停止什么的,,是比较重要的一个概念。。

这里先来看看Handler接口是怎么定义的吧:

[java] view plaincopy


  1. public interface Handler extends LifeCycle  
  2. {  
  3.     //转发的类型  
  4.     public static final int DEFAULT=0;  
  5.     public static final int REQUEST=1;  
  6.     public static final int FORWARD=2;  
  7.     public static final int INCLUDE=4;  
  8.     public static final int ERROR=8;  
  9.     public static final int ALL=15;  
  10.       
  11.       
  12.     //用于处理http请求,target一般是url,dispatch是转发的类型  
  13.     public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)  
  14.         throws IOException, ServletException;  
  15.     //设置当前handler的server  
  16.     public void setServer(Server server);  
  17.     public Server getServer();  
  18.       
  19.     public void destroy();  
  20.       
  21. }  

这里handler的接口定义还是很简单的,handler方法就是用于处理http请求的,另外还可以看出每一个handler都应该关联一个server。。

接下来来看看LifeCycle接口的定义:

[java] view plaincopy


  1. //用于维护组件的生命周期  
  2. public interface LifeCycle  
  3. {  
  4.     //start这个组件  
  5.     public void start()  
  6.         throws Exception;  
  7.   
  8.     //停止这个组件  
  9.     public void stop()  
  10.         throws Exception;  
  11.   
  12.     //是否已经started或者正在start  
  13.     public boolean isRunning();  
  14.   
  15.     //判断是否已经开启  
  16.     public boolean isStarted();  
  17.   
  18.    //是否正在开启  
  19.     public boolean isStarting();  
  20.   
  21.     //是否正在停止  
  22.     public boolean isStopping();  
  23.   
  24.     //是否已经停止  
  25.     public boolean isStopped();  
  26.   
  27.     //当前组件是否启动失败  
  28.     public boolean isFailed();  
  29.       
  30.     //为当前的组就爱你添加一个listener  
  31.     public void addLifeCycleListener(LifeCycle.Listener listener);  
  32.   
  33.     //删除一个listener,当当前组件的状态发生改变的时候会调用  
  34.     public void removeLifeCycleListener(LifeCycle.Listener listener);  
  35.       
  36.     //listener接口的定义  
  37.     public interface Listener extends EventListener  
  38.     {  
  39.         public void lifeCycleStarting(LifeCycle event);  
  40.         public void lifeCycleStarted(LifeCycle event);  
  41.         public void lifeCycleFailure(LifeCycle event,Throwable cause);  
  42.         public void lifeCycleStopping(LifeCycle event);  
  43.         public void lifeCycleStopped(LifeCycle event);  
  44.     }  
  45. }  

本身这个接口的定义也很简单,无非就是一些start,stop方法,以及判断当前组件的状态,另外还定义了listener,用于监听当前组件的装填,当组件的状态发生变化的时候就会调用listener相应的方法。。这个很容易就能够看明白。。。

接下来来看看AbstractLifeCycle的定义吧:

[java] view plaincopy


  1. public abstract class AbstractLifeCycle implements LifeCycle  
  2. {  
  3.     private Object _lock = new Object();   //用于加锁  
  4.     private final int FAILED = -1, STOPPED = 0, STARTING = 1, STARTED = 2, STOPPING = 3;  
  5.     private transient int _state = STOPPED;   //当前组件的状态,那么刚开始肯定是stopped的  
  6.     protected LifeCycle.Listener[] _listeners;  //当前塑件的所有listener  
  7.     //用于组件的启动,这个方法一般会在子类中重载  
  8.     protected void doStart() throws Exception  
  9.     {  
  10.     }  
  11.     //在子类中一般重载这个方法  
  12.     protected void doStop() throws Exception  
  13.     {  
  14.     }  
  15.     //这里对doStart方法做了一个代理,因为实在线程池中运行,所以考虑到并发问题。。。,并要更改当前组件的状态  
  16.     public final void start() throws Exception  
  17.     {  
  18.         synchronized (_lock)  
  19.         {  
  20.             try  
  21.             {  
  22.                 if (_state == STARTED || _state == STARTING)  //避免重复启动  
  23.                     return;  
  24.                 setStarting();  
  25.                 doStart();  
  26.                 Log.debug(”started {}”,this);  
  27.                 setStarted();  
  28.             }  
  29.             catch (Exception e)  
  30.             {  
  31.                 Log.warn(”failed ” + this,e);  
  32.                 setFailed(e);  
  33.                 throw e;  
  34.             }  
  35.             catch (Error e)  
  36.             {  
  37.                 Log.warn(”failed ” + this,e);  
  38.                 setFailed(e);  
  39.                 throw e;  
  40.             }  
  41.         }  
  42.     }  
  43.     //与上面start类似  
  44.     public final void stop() throws Exception  
  45.     {  
  46.         synchronized (_lock)  
  47.         {  
  48.             try  
  49.             {  
  50.                 if (_state == STOPPING || _state == STOPPED)  
  51.                     return;  
  52.                 setStopping();  
  53.                 doStop();  
  54.                 Log.debug(”stopped {}”,this);  
  55.                 setStopped();  
  56.             }  
  57.             catch (Exception e)  
  58.             {  
  59.                 Log.warn(”failed ” + this,e);  
  60.                 setFailed(e);  
  61.                 throw e;  
  62.             }  
  63.             catch (Error e)  
  64.             {  
  65.                 Log.warn(”failed ” + this,e);  
  66.                 setFailed(e);  
  67.                 throw e;  
  68.             }  
  69.         }  
  70.     }  
  71.   
  72.     public boolean isRunning()  
  73.     {  
  74.         return _state == STARTED || _state == STARTING;  
  75.     }  
  76.   
  77.     public boolean isStarted()  
  78.     {  
  79.         return _state == STARTED;  
  80.     }  
  81.   
  82.     public boolean isStarting()  
  83.     {  
  84.         return _state == STARTING;  
  85.     }  
  86.   
  87.     public boolean isStopping()  
  88.     {  
  89.         return _state == STOPPING;  
  90.     }  
  91.   
  92.     public boolean isStopped()  
  93.     {  
  94.         return _state == STOPPED;  
  95.     }  
  96.   
  97.     public boolean isFailed()  
  98.     {  
  99.         return _state == FAILED;  
  100.     }  
  101.     //添加listener  
  102.     public void addLifeCycleListener(LifeCycle.Listener listener)  
  103.     {  
  104.         _listeners = (LifeCycle.Listener[])LazyList.addToArray(_listeners,listener,LifeCycle.Listener.class);  
  105.     }  
  106.   
  107.     public void removeLifeCycleListener(LifeCycle.Listener listener)  
  108.     {  
  109.         LazyList.removeFromArray(_listeners,listener);  
  110.     }  
  111.   
  112.     private void setStarted()  
  113.     {  
  114.         _state = STARTED;  //表示当前组件已经启动了  
  115.         if (_listeners != null)  //激活所有的listener方法  
  116.         {  
  117.             for (int i = 0; i < _listeners.length; i++)  
  118.             {  
  119.                 _listeners[i].lifeCycleStarted(this);  
  120.             }  
  121.         }  
  122.     }  
  123.   
  124.     private void setStarting()  
  125.     {  
  126.         _state = STARTING;  
  127.         if (_listeners != null)  
  128.         {  
  129.             for (int i = 0; i < _listeners.length; i++)  
  130.             {  
  131.                 _listeners[i].lifeCycleStarting(this);  
  132.             }  
  133.         }  
  134.     }  
  135.   
  136.     private void setStopping()  
  137.     {  
  138.         _state = STOPPING;  
  139.         if (_listeners != null)  
  140.         {  
  141.             for (int i = 0; i < _listeners.length; i++)  
  142.             {  
  143.                 _listeners[i].lifeCycleStopping(this);  
  144.             }  
  145.         }  
  146.     }  
  147.     //更改当前组件的装填,并且激活listener相应的方法  
  148.     private void setStopped()  
  149.     {  
  150.         _state = STOPPED;  
  151.         if (_listeners != null)  
  152.         {  
  153.             for (int i = 0; i < _listeners.length; i++)  
  154.             {  
  155.                 _listeners[i].lifeCycleStopped(this);  
  156.             }  
  157.         }  
  158.     }  
  159.   
  160.     private void setFailed(Throwable error)  
  161.     {  
  162.         _state = FAILED;  
  163.         if (_listeners != null)  
  164.         {  
  165.             for (int i = 0; i < _listeners.length; i++)  
  166.             {  
  167.                 _listeners[i].lifeCycleFailure(this,error);  
  168.             }  
  169.         }  
  170.     }  
  171.   
  172. }  

代码虽然还挺长的,不过其实很简单,实现了LifeCycle中定义的方法,另外还定义了doStart和doStop两个方法,留给子类来实现。。。

最后来看看AbstractHandler的定义:

[java] view plaincopy


  1. public abstract class AbstractHandler extends AbstractLifeCycle implements Handler  
  2. {  
  3.     protected String _string;  
  4.     private Server _server;   //当前handler所属的server  
  5.       
  6.   
  7.     public AbstractHandler()  
  8.     {  
  9.     }  
  10.     protected void doStart() throws Exception  
  11.     {  
  12.         Log.debug(”starting {}”,this);  
  13.     }  
  14.   
  15.     protected void doStop() throws Exception  
  16.     {  
  17.         Log.debug(”stopping {}”,this);  
  18.     }  
  19.   
  20.     /* ———————————————————— */  
  21.     public String toString()  
  22.     {  
  23.         if (_string==null)  
  24.         {  
  25.             _string=super.toString();  
  26.             _string=_string.substring(_string.lastIndexOf(’.’)+1);  
  27.         }  
  28.         return _string;  
  29.     }  
  30.   
  31.     //设置当前handler关联的server  
  32.     public void setServer(Server server)  
  33.     {  
  34.         Server old_server=_server;  
  35.         if (old_server!=null && old_server!=server)  
  36.             old_server.getContainer().removeBean(this);  
  37.         _server=server;  
  38.         if (_server!=null && _server!=old_server)  
  39.             _server.getContainer().addBean(this);  
  40.     }  
  41.   
  42.     public Server getServer()  
  43.     {  
  44.         return _server;  
  45.     }  
  46.   
  47.     public void destroy()  
  48.     {  
  49.         if (!isStopped())  
  50.             throw new IllegalStateException(“!STOPPED”);  
  51.         if (_server!=null)  
  52.             _server.getContainer().removeBean(this);  
  53.     }  
  54.   
  55. }  

其实它的定义也很简单吧,大多数都是实现了空方法,留给子类来实现。。。


好了jetty的第一篇文章还是很轻松愉快的。。。

0 0
原创粉丝点击