Hadoop Common源码分析之服务Service

        Service是定义Hadoop中服务生命周期的一个接口。Service内部定义了服务的状态及生命周期,在服务被构造后,其一个生命周期内的状态为NOTINITED未初始化--INITED已初始化--已启动STARTED--已停止STOPPED,而这一生命周期内服务状态的变化,是随着如下方法链的调用而变化的:init()--start()--stop(),服务构造后整体方法调用及状态转移如下图所示:

                                                                                   

        下面,我们来看下Service的源码分析,先看下其内部定义的服务状态,如下:

  /**
   * Service states
   * 服务状态
   */
  public enum STATE {
    /** Constructed but not initialized */
	// 服务实例已经构造但是还没有初始化
    NOTINITED(0, "NOTINITED"),

    /** Initialized but not started or stopped */
    // 服务实例已经初始化但还没有启动或停止
    INITED(1, "INITED"),

    /** started and not stopped */
    // 服务实例已经启动但没有停止
    STARTED(2, "STARTED"),

    /** stopped. No further state transitions are permitted */
    // 服务实例已经停止,不允许进一步的状态转换
    STOPPED(3, "STOPPED");

    /**
     * An integer value for use in array lookup and JMX interfaces.
     * Although {@link Enum#ordinal()} could do this, explicitly
     * identify the numbers gives more stability guarantees over time.
     */
    private final int value;

    /**
     * A name of the state that can be used in messages
     */
    private final String statename;

    private STATE(int value, String name) {
      this.value = value;
      this.statename = name;
    }

    /**
     * Get the integer value of a state
     * @return the numeric value of the state
     */
    public int getValue() {
      return value;
    }

    /**
     * Get the name of a state
     * @return the state's name
     */
    @Override
    public String toString() {
      return statename;
    }
  }

        STATE是一个枚举类,代表了服务生命周期内各阶段的状态,分别为:

        1、NOTINITED--0:服务实例已经构造但是还没有初始化;

        2、INITED--1:服务实例已经初始化但还没有启动或停止;

        3、STARTED--2:服务实例已经启动但没有停止;

        4、STOPPED--3:服务实例已经停止,不允许进一步的状态转换。

        接下来,我们再看下导致服务状态变更的各个方法,如下:

        1、初始化服务init(): NOTINITED-->INITED/STOPPED

  /**
   * Initialize the service.
   * 初始化服务
   *
   * The transition MUST be from {@link STATE#NOTINITED} to {@link STATE#INITED}
   * unless the operation failed and an exception was raised, in which case
   * {@link #stop()} MUST be invoked and the service enter the state
   * {@link STATE#STOPPED}.
   *
   * 初始化后,服务状态由NOTINITED转换到INITED,除非异常发生导致服务初始化操作失败,
   * 在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。
   *
   * @param config the configuration of the service
   * @throws RuntimeException on any failure during the operation

        初始化后,服务状态由NOTINITED转换到INITED,除非异常发生导致服务初始化操作失败,在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。

        2、启动服务start():INITED-->STARTED/STOPPED

  /**
   * Start the service.
   * 启动服务
   *
   * The transition MUST be from {@link STATE#INITED} to {@link STATE#STARTED}
   * unless the operation failed and an exception was raised, in which case
   * {@link #stop()} MUST be invoked and the service enter the state
   * {@link STATE#STOPPED}.
   *
   * 服务启动后,服务状态由INITED转换到STARTED,除非异常发生导致服务启动操作失败,
   * 在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。
   *
   * @throws RuntimeException on any failure during the operation
   */

        服务启动后,服务状态由INITED转换到STARTED,除非异常发生导致服务启动操作失败,在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。

        3、停止服务stop():NOTINITED/INITED/STARTED-->STOPPED

  /**
   * Stop the service. This MUST be a no-op if the service is already
   * in the {@link STATE#STOPPED} state. It SHOULD be a best-effort attempt
   * to stop all parts of the service.
   * 停止服务。如果服务已经处于STOPPED状态,这必须是一个空操作。它应该尽力试图停止服务的所有部分。
   *
   * The implementation must be designed to complete regardless of the service
   * state, including the initialized/uninitialized state of all its internal
   * fields.
   * 实现者必须被设计为完成这个操作,而不管服务的状态,包括其内部所有字段初始化/未初始化的状态。
   *
   * @throws RuntimeException on any failure during the stop operation
   */
  void stop();

        停止服务。如果服务已经处于STOPPED状态,这必须是一个空操作。它应该尽力试图停止服务的所有部分。实现者必须被设计为完成这个操作,而不管服务的状态,包括其内部所有字段初始化/未初始化的状态。

        为了兼顾Java7闭包条款,Service接口还提供了close()方法,实际上就是调用stop()方法,代码如下:

  /**
   * A version of stop() that is designed to be usable in Java7 closure
   * clauses.
   * 适用于Java7闭包条款的stop()版本,实际上就是调用stop()方法。
   *
   * Implementation classes MUST relay this directly to {@link #stop()}
   * 实现类必须直接传递给stop()方法。
   *
   * @throws IOException never
   * @throws RuntimeException on any failure during the stop operation
   */
  void close() throws IOException;

        Service的另外一大块内容,就是对于服务状态变更时间的监听,并提供了注册监听器与注销监听器的方法,如下:

        1、注册监听器registerServiceListener()

  /**
   * Register a listener to the service state change events.
   * If the supplied listener is already listening to this service,
   * this method is a no-op.
   * 注册一个监听器到服务状态变更事件。
   * 如果提供的监听器已经监听此服务,这种方法是一个空操作。
   * @param listener a new listener
   */
  void registerServiceListener(ServiceStateChangeListener listener);

        2、注销监听器unregisterServiceListener()

  /**
   * Unregister a previously registered listener of the service state
   * change events. No-op if the listener is already unregistered.
   * 注销之前的一个注册到服务状态变更事件的监听器。
   * 如果监听器已经注销,这种方法是一个空操作。
   * @param listener the listener to unregister.
   */
  void unregisterServiceListener(ServiceStateChangeListener listener);

        还有,Service还提供了获取服务失败时发生的第一个异常和当时状态的方法,如下:

  /**
   * Get the first exception raised during the service failure. If null,
   * no exception was logged
   * 获取服务失败时发生的第一个异常
   * @return the failure logged during a transition to the stopped state
   */
  Throwable getFailureCause();

  /**
   * Get the state in which the failure in {@link #getFailureCause()} occurred.
   * 获取服务失败发生的第一个异常时的服务状态
   * @return the state or null if there was no failure
   */
  STATE getFailureState();

        既然是一个服务,Service还提供了阻塞等待服务停止的waitForServiceToStop()方法,如下:

  /**
   * Block waiting for the service to stop; uses the termination notification
   * object to do so.
   * 阻塞,等待服务停止;通过终止通知对象实现。
   *
   * This method will only return after all the service stop actions
   * have been executed (to success or failure), or the timeout elapsed
   * This method can be called before the service is inited or started; this is
   * to eliminate any race condition with the service stopping before
   * this event occurs.
   * @param timeout timeout in milliseconds. A value of zero means "forever"
   * @return true iff the service stopped in the time period
   */
  boolean waitForServiceToStop(long timeout);

        其它诸如获取服务名、获取当前服务状态、获取服务启动时间、查询是否服务是在一个特定的状态、获取生命周期历史的一个快照、获取远程依赖服务的正在停止服务的阻塞者等方法不再一一介绍,读者可自行查询,下面只把代码贴出:

  /**
   * Get the name of this service.
   * 获取服务名
   * @return the service name
   */
  String getName();

  /**
   * Get the configuration of this service.
   * 获取服务的配置信息
   * This is normally not a clone and may be manipulated, though there are no
   * guarantees as to what the consequences of such actions may be
   * @return the current configuration, unless a specific implentation chooses
   * otherwise.
   */
  Configuration getConfig();

  /**
   * Get the current service state
   * 获取当前服务状态
   * @return the state of the service
   */
  STATE getServiceState();

  /**
   * Get the service start time
   * 获取服务启动时间
   * @return the start time of the service. This will be zero if the service
   * has not yet been started.
   */
  long getStartTime();

  /**
   * Query to see if the service is in a specific state.
   * 查询是否服务是在一个特定的状态
   * In a multi-threaded system, the state may not hold for very long.
   * 在多线程系统中,服务状态可能不会保持很长时间。
   * @param state the expected state
   * @return true if, at the time of invocation, the service was in that state.
   */
  boolean isInState(STATE state);

  /**
   * Get a snapshot of the lifecycle history; it is a static list
   * 获取生命周期历史的一个快照,它是一个静态列表
   * @return a possibly empty but never null list of lifecycle events.
   */
  public List<LifecycleEvent> getLifecycleHistory();

  /**
   * Get the blockers on a service -remote dependencies
   * that are stopping the service from being <i>live</i>.
   *
   * 获取远程依赖服务的正在停止服务的阻塞者
   *
   * @return a (snapshotted) map of blocker name->description values
   */
  public Map<String, String> getBlockers();
时间: 2024-09-21 13:31:17

Hadoop Common源码分析之服务Service的相关文章

Hadoop Common源码分析之SerializationFactory、Serialization

        SerializationFactory是Hadoop中的一个序列化器工厂,它除了用来存储序列化器种类.更新序列化器相关配置信息,还提供了根据指定待序列化类获取相匹配的序列化器和反序列化器的功能.         SerializationFactory中的关键成员变量只有一个,如下: private List<Serialization<?>> serializations = new ArrayList<Serialization<?>>

TOMCAT源码分析——停止服务

前言 在<TOMCAT源码分析--启动服务>一文中我介绍了Tomcat服务的启动过程分析,本文讲解Tomcat服务是如何停止的. 停止过程分析 我们停止Tomcat的命令如下: sh shutdown.sh 所以,将从shell脚本shutdown.sh开始分析Tomcat的停止过程.shutdown.sh的脚本代码见代码清单10. 代码清单10 os400=false case "`uname`" in OS400*) os400=true;; esac # resolv

TOMCAT源码分析——启动服务

前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家一定知道改如何使用它,但是它们究竟是如何实现的,尤其是shutdown.sh脚本(或者shutdown.bat)究竟是如何和Tomcat进程通信的呢?本文将通过对Tomcat7.0的源码阅读,深入剖析这一过程. 由于在生产环境中,Tomcat一般部署在Linux系统下,所以本文将以startup.s

Hadoop2源码分析-准备篇

1.概述 我们已经能够搭建一个高可用的Hadoop平台了,也熟悉并掌握了一个项目在Hadoop平台下的开发流程,基于Hadoop的一些套件我们也能够使用,并且能利用这些套件进行一些任务的开发.在Hadoop的应用级别上,我们接着往后面去研究学习,那就是Hadoop的源码了,作为Hadoop开发人员,我们得去学习和研究Hadoop得实现原理,底层框架的设计,编码的实现过程等等,下面就开始我们今天的Hadoop源码分析之旅. 2.准备 在分析源码之前,我们需要准备好分析源码的环境,以及如何去分析(分

dubbo源码分析系列(3)服务的引用

1 系列目录 dubbo源码分析系列(1)扩展机制的实现 dubbo源码分析系列(2)服务的发布 dubbo源码分析系列(3)服务的引用 dubbo源码分析系列(4)dubbo通信设计 2 服务引用案例介绍 先看一个简单的客户端引用服务的例子,dubbo配置如下: <dubbo:application name="consumer-of-helloService" /> <dubbo:registry protocol="zookeeper" ad

dubbo源码分析系列(2)服务的发布

1 系列目录 dubbo源码分析系列(1)扩展机制的实现 dubbo源码分析系列(2)服务的发布 dubbo源码分析系列(3)服务的引用 dubbo源码分析系列(4)dubbo通信设计 2 dubbo与spring接入 dubbo的官方文档也说明了,dubbo可以不依赖任何Spring.这一块日后再详细说明,目前先介绍dubbo与Spring的集成.与spring的集成是基于Spring的Schema扩展进行加载 2.1 Spring对外留出的扩展 用过Spring就知道可以在xml文件中进行如

Hadoop2源码分析-Hadoop V2初识

1.概述 在完成分析Hadoop2源码的准备工作后,我们进入到后续的源码学习阶段.本篇博客给大家分享,让大家对Hadoop V2有个初步认识,博客的目录内容如下所示: Hadoop的渊源 Hadoop V2部分项目图 各个包的功能介绍 本篇文章的源码是基于Hadoop-2.6.0来分析,其他版本的Hadoop的源码可以此作为参考分析. 2.Hadoop的渊源 其实,早年Google的核心竞争力是它的计算平台,Google对外公布的论文有一下内容: GoogleCluster  Chubby  G

《深入理解SPARK:核心思想与源码分析》一书正式出版上市

自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售,欢迎感兴趣的同学购买.我开始研究源码时的Spark版本是1.2.0,经过7个多月的研究和出版社近4个月的流程,Spark自身的版本迭代也很快,如今最新已经是1.6.0.目前市面上另外2本源码研究的Spark书籍的版本分别是0.9.0版本和1.2.0版本,看来这些书的作者都与我一样,遇到了这种问题.由于研究和

深入理解Spark:核心思想与源码分析

大数据技术丛书 深入理解Spark:核心思想与源码分析 耿嘉安 著 图书在版编目(CIP)数据 深入理解Spark:核心思想与源码分析/耿嘉安著. -北京:机械工业出版社,2015.12 (大数据技术丛书) ISBN 978-7-111-52234-8 I. 深- II.耿- III.数据处理软件 IV. TP274 中国版本图书馆CIP数据核字(2015)第280808号 深入理解Spark:核心思想与源码分析 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037)