`
cuizhenfu#gmail.com
  • 浏览: 67468 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

自定义服务时服务的启动顺序

阅读更多
在实现自定义服务时,我们很可能会依赖其它服务或核心服务,在这种情况下,要求自定义服务的启动必须在依赖服务启动之后。例如我们在ResolverService服务之上实现自己的服务,就是说我们的服务要使用ResolverService来实现自己的功能。
那么在自定义服务的
java 代码
 
  1. public int startApp(String[] args) {  
  2.     // Now that the service is being started, set the ResolverService  
  3.     // object to use handle our queries and send responses.  
  4.     resolver = peerGroup.getResolverService();  
  5.     if(resolver == null) {  
  6.         return Module.START_AGAIN_PROGRESS;  
  7.     }  
  8.     // Add ourselves as a handler using the uniquely constructed  
  9.     // handler name.  
  10.     resolver.registerHandler(handlerName, this);  
  11.     return Module.START_OK;  
  12. }  
通过上述代码判断,如果resolver的值为null,那么说明ResolverService还没有初始化,我们返回Module.START_AGAIN_PROGRESS,表示我们的服务还需要再次初始化。如果resolver的值不为null,那么说明ResolverService已经初始化,我们返回Module.START_OK,即可。其它依赖服务与此类似。

下面的Module接口中对几个常量进行了说明,可以看出
Module.START_AGAIN_PROGRESS与Module.START_AGAIN_STALLED的含义基本相同。

java 代码
 
  1. /* 
  2.  * Copyright (c) 2001-2007 Sun Microsystems, Inc.  All rights reserved. 
  3.  *   
  4.  *  The Sun Project JXTA(TM) Software License 
  5.  *   
  6.  *  Redistribution and use in source and binary forms, with or without  
  7.  *  modification, are permitted provided that the following conditions are met: 
  8.  *   
  9.  *  1. Redistributions of source code must retain the above copyright notice, 
  10.  *     this list of conditions and the following disclaimer. 
  11.  *   
  12.  *  2. Redistributions in binary form must reproduce the above copyright notice,  
  13.  *     this list of conditions and the following disclaimer in the documentation  
  14.  *     and/or other materials provided with the distribution. 
  15.  *   
  16.  *  3. The end-user documentation included with the redistribution, if any, must  
  17.  *     include the following acknowledgment: "This product includes software  
  18.  *     developed by Sun Microsystems, Inc. for JXTA(TM) technology."  
  19.  *     Alternately, this acknowledgment may appear in the software itself, if  
  20.  *     and wherever such third-party acknowledgments normally appear. 
  21.  *   
  22.  *  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must  
  23.  *     not be used to endorse or promote products derived from this software  
  24.  *     without prior written permission. For written permission, please contact  
  25.  *     Project JXTA at http://www.jxta.org. 
  26.  *   
  27.  *  5. Products derived from this software may not be called "JXTA", nor may  
  28.  *     "JXTA" appear in their name, without prior written permission of Sun. 
  29.  *   
  30.  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, 
  31.  *  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  
  32.  *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN  
  33.  *  MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,  
  34.  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  
  35.  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  
  36.  *  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  
  37.  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  
  38.  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  
  39.  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  40.  *   
  41.  *  JXTA is a registered trademark of Sun Microsystems, Inc. in the United  
  42.  *  States and other countries. 
  43.  *   
  44.  *  Please see the license information page at : 
  45.  *  <http://www.jxta.org/project/www/license.html> for instructions on use of  
  46.  *  the license in source files. 
  47.  *   
  48.  *  ==================================================================== 
  49.  *   
  50.  *  This software consists of voluntary contributions made by many individuals  
  51.  *  on behalf of Project JXTA. For more information on Project JXTA, please see  
  52.  *  http://www.jxta.org. 
  53.  *   
  54.  *  This license is based on the BSD license adopted by the Apache Foundation.  
  55.  */  
  56.   
  57. package net.jxta.platform;  
  58.   
  59.   
  60. import net.jxta.peergroup.PeerGroup;  
  61. import net.jxta.document.Advertisement;  
  62. import net.jxta.id.ID;  
  63. import net.jxta.exception.PeerGroupException;  
  64.   
  65.   
  66. /** 
  67.  * Defines the interface for modules loaded by PeerGroups. Message transports, 
  68.  * services and applications need to implement this interface if they are 
  69.  * to be loaded and started by a PeerGroup. Service and Application extend 
  70.  * Module, PeerGroup implements Service and ShellApp implements Application, as 
  71.  * a result both implement Module. 
  72.  * 
  73.  * <p/>Jxta Modules are given their initialization parameters via the init() 
  74.  * method rather than a non-default constructor. 
  75.  * 
  76.  * <p/>Modules are passed the peer group within which they are created. 
  77.  * From the peergroup object, Modules can access all the peer group 
  78.  * services. The PeerGroup within which a PeerGroup runs is known as its 
  79.  * parent. 
  80.  * 
  81.  * <p/>The initial root peer group is known as the World Peer Group and is 
  82.  * implemented by an object of class Platform, a subclass of PeerGroup. 
  83.  * The "parent" PeerGroup of the World Peer Group is null. 
  84.  * 
  85.  * @see net.jxta.protocol.ModuleImplAdvertisement 
  86.  * @see net.jxta.platform.ModuleClassID 
  87.  * @see net.jxta.peergroup.PeerGroup 
  88.  * @see net.jxta.document.Advertisement 
  89.  * @see net.jxta.id.ID 
  90.  * @see net.jxta.platform.Application 
  91.  * @see net.jxta.service.Service 
  92.  **/  
  93. public interface Module {  
  94.       
  95.     /** 
  96.      * <code>startApp()</code> completed successfully. This module claims to now 
  97.      * be fully functional and no further invocation of startApp is required. 
  98.      **/  
  99.     public static final int START_OK = 0;  
  100.       
  101.     /** 
  102.      * This is to be used mostly by co-dependent services when started as 
  103.      * a set (such as {@link PeerGroup} services) so that their 
  104.      * <code>startApp()</code> method may be invoked multiple times. 
  105.      * 
  106.      * <p/>This value indicates that startApp must be retried later in order for 
  107.      * this module to become fully functional. However, some progress in 
  108.      * functionality was accomplished. 
  109.      * 
  110.      * <p/>This is a strong indication that some other modules may be able 
  111.      * to advance or complete their initialization if their 
  112.      * <code>startApp()</code> method is invoked again. 
  113.      * 
  114.      * <p/>The distinction between START_AGAIN_STALLED and START_AGAIN_PROGRESS 
  115.      * is only a hint. Each module makes an arbitrary judgment in this 
  116.      * respect. It is up to the invoker of startApp to ensure that the 
  117.      * starting of a set of modules eventually succeeds or fails. 
  118.      **/  
  119.     public static final int START_AGAIN_PROGRESS = 1;  
  120.       
  121.     /** 
  122.      * This is to be used mostly by co-dependent services when started as 
  123.      * a set (such as {@link PeerGroup} services) so that their startApp 
  124.      * method may be invoked multiple times. 
  125.      * 
  126.      * <p/>This value indicates that startApp must be retried later in order for 
  127.      * this module to become fully functional. However, some progress in 
  128.      * functionality was accomplished. 
  129.      * 
  130.      * <p/>If all modules in a set return this value, it is a strong indication 
  131.      * that the modules co-dependency is such that it prevents them 
  132.      * collectively from starting. 
  133.      * 
  134.      * <p/>The distinction between START_AGAIN_STALLED and START_AGAIN_PROGRESS 
  135.      * is only a hint. Each module makes an arbitrary judgment in this 
  136.      * respect. It is up to the invoker of startApp to ensure that the 
  137.      * starting of a set of modules eventually succeeds or fails. 
  138.      **/  
  139.     public static final int START_AGAIN_STALLED = 2;  
  140.           
  141.     /** 
  142.      * This return result is used to indicate that the module refuses to start 
  143.      * because it has been configured to be disabled or otherwise cannot run 
  144.      * (missing hardware, missing system resources, etc.) The module will not be 
  145.      * functional and should be discarded but the failure to load may be ignored  
  146.      * by the loader at it's discretion. 
  147.      */  
  148.     public static final int START_DISABLED = Integer.MIN_VALUE + 100;  
  149.       
  150.     /** 
  151.      * Initialize the module, passing it its peer group and advertisement. 
  152.      * 
  153.      * <p/>Note: when subclassing one of the existing PeerGroup implementations 
  154.      * (which implement Module), it may not be recommended to overload the init 
  155.      * method. See the documentation of the PeerGroup class being subclassed. 
  156.      * 
  157.      *  @param group The PeerGroup from which this Module can obtain services. 
  158.      *  If this module is a Service, this is also the PeerGroup of which this 
  159.      *  module is a service. 
  160.      * 
  161.      *  @param assignedID Identity of Module within group. 
  162.      *  modules can use it as a the root of their namespace to create 
  163.      *  names that are unique within the group but predictable by the 
  164.      *  same module on another peer. This is normally the ModuleClassID 
  165.      *  which is also the name under which the module is known by other 
  166.      *  modules. For a group it is the PeerGroupID itself. 
  167.      *  The parameters of a service, in the Peer configuration, are indexed 
  168.      *  by the assignedID of that service, and a Service must publish its 
  169.      *  run-time parameters in the Peer Advertisement under its assigned ID. 
  170.      * 
  171.      *  @param implAdv The implementation advertisement for this 
  172.      *  Module. It is permissible to pass null if no implementation 
  173.      *  advertisement is available. This may happen if the 
  174.      *  implementation was selected by explicit class name rather than 
  175.      *  by following an implementation advertisement. Modules are not 
  176.      *  required to support that style of loading, but if they do, then 
  177.      *  their documentation should mention it. 
  178.      * 
  179.      *  @exception PeerGroupException This module failed to initialize. 
  180.      **/  
  181.     public void init(PeerGroup group, ID assignedID, Advertisement implAdv) throws PeerGroupException;  
  182.       
  183.     /** 
  184.      * Complete any remaining initialization of the module. The module should 
  185.      * be fully functional after <code>startApp()</code> is completed. That is 
  186.      * also the opportunity to supply arbitrary arguments (mostly to 
  187.      * applications). 
  188.      * 
  189.      * <p/>If this module is a {@link PeerGroup} service, it may be invoked 
  190.      * several times depending on its return value. 
  191.      * 
  192.      * @param args An array of Strings forming the parameters for this 
  193.      * Module. 
  194.      * 
  195.      * @return int A status indication which may be one of 
  196.      * {@link #START_OK}, {@link #START_AGAIN_PROGRESS}, 
  197.      * {@link #START_AGAIN_STALLED}, which indicates partial or complete 
  198.      * success, or any other value (negative values are 
  199.      * recommended for future compatibility), which indicates failure. 
  200.      **/  
  201.     public int startApp(String[] args);  
  202.       
  203.     /** 
  204.      *  Stop a module. This may be called any time after <code>init()</code> 
  205.      *  completes and should not assume that <code>startApp()</code> has been 
  206.      *  called or completed. 
  207.      * 
  208.      *  <p/>The Module cannot be forced to comply, but in the future 
  209.      *  we might be able to deny it access to anything after some timeout. 
  210.      **/  
  211.     public void stopApp();  
  212. }  
分享到:
评论

相关推荐

    自定义软件开机启动顺序

    【标题】"自定义软件开机启动顺序"涉及的是操作系统中的启动项管理,特别是Windows XP系统下的启动优化。在计算机启动时,操作系统会加载一系列程序和服务,这些程序和服务被称为开机启动项。用户可以通过调整启动...

    修改ubuntu启动顺序

    本文将详细介绍如何在不同版本的Ubuntu中修改启动顺序,使得用户可以根据自己的需求进行自定义设置。 #### 二、基本原理 在Ubuntu中,GRUB(Grand Unified Bootloader)是默认的启动加载器,它负责管理启动菜单并...

    systemd添加自定义系统服务设置自定义开机启动的方法

    - `[Unit]` 部分包含服务的描述和文档链接,以及启动顺序(Before/After)。 - `[Service]` 部分定义了服务的类型(如 `forking`)、PID 文件、启动和停止命令等。 - `[Install]` 部分指定了服务在哪个目标...

    Linux 开机(服务、脚本)启动顺序.docx

    Linux 开机服务启动顺序 Linux 系统运行级别是基于 SysVinit 概念的,通过配置脚本文件实现 Linux 开机服务。SysVinit 以运行级的模式来工作,一般有 7 个运行级(从 0 到 6),每个运行级对应于一套设定好的任务。...

    开机启动顺序管理 批量开机启动 延时开机启动

    首先,开机启动顺序是指操作系统启动时加载的程序和服务的顺序。这些程序通常包括系统核心服务、驱动程序和用户自定义的启动应用。启动顺序对系统的整体响应速度有直接影响,因为每个启动项都需要占用一定的系统资源...

    Arm-linux 自定义开机启动程序,避开从桌面启动

    在Arm-Linux平台上进行嵌入式开发时,经常会遇到需要自定义开机启动程序的需求。例如,当开发者希望在启动时直接运行自己开发的Qt界面程序,而不是先启动系统桌面环境再手动打开程序。这样做不仅可以提高启动效率,...

    CentOS7添加自定义系统服务1

    通过这种方式,我们可以有效地管理和控制Oracle数据库作为系统服务在CentOS7中的运行,确保其在系统启动时自动启动,并遵循预定义的启动顺序和依赖关系。这对于确保数据库系统的稳定性和可靠性至关重要。

    改变启动顺序以及grub2 配置技巧

    通过以上步骤,你可以轻松地更改双系统环境中的默认启动顺序,并且根据个人喜好进行各种自定义设置。这对于日常使用或系统故障恢复时选择正确的操作系统非常有用。掌握这些技巧不仅可以提高工作效率,还能帮助解决...

    startdelay_v2.3服务器启动延迟

    该软件的核心功能在于允许管理员自定义服务的启动顺序,以避免某些依赖关系导致的阻塞,同时它还引入了自动延时控制,使得启动过程中各服务间的依赖关系得以平滑处理,从而降低启动延迟。 三、自控延时机制 start...

    自定义启动u盘必用工具 grubEditor

    【自定义启动u盘必用工具 grubEditor】是一款强大的引导加载器编辑工具,主要用于自定义启动USB设备...在自定义启动u盘的过程中,理解GRUB的基本概念和工作原理是非常有帮助的,这将使你在遇到问题时能够更有效地解决。

    自定义FilterChain的编写

    这样,当你启动应用时,容器会使用你的自定义`FilterChain`实例。 例如,你有一个名为`SensitiveWordFilter`的过滤器,它用于检查并替换请求中敏感词汇。在自定义`FilterChain`中,你可以确保`SensitiveWordFilter`...

    Delphi TDBGrid自定义布局

    当程序再次启动时,读取这些信息并重新设置列的顺序。 2. **自定义列宽** 类似地,我们可以记录用户对列宽的调整,将其存储起来,并在需要时恢复。TDBGrid.Columns对象的Width属性可以用来设置列的宽度。 3. **...

    windows系统 自动软件 管理系统,可以自定义开机启动的软件

    不过,要自定义启动顺序,通常需要使用第三方工具或者手动调整启动文件的位置。 1. **自定义配置文件**:在提供的文件中,`set.ini`可能是一个配置文件,用于定义程序启动的顺序。用户可以根据需要编辑这个文件,...

    Android自定义桌面-选择要显示的应用

    1. 应用抽屉排序:在自定义启动器中,用户可以调整应用抽屉中的应用顺序,按字母、最近使用或自定义顺序排列。 2. 快捷方式管理:可以创建应用快捷方式,放置在主屏幕上,便于快速启动。同时,可以删除不需要的快捷...

    Oracle服务启动的步骤

    `rc.local`是一个启动脚本,位于`/etc`目录下,用于在系统启动时执行自定义的初始化任务。在这个场景中,rc.local可能包含了启动Oracle服务的命令。执行该文件通常是通过运行`/etc/rc.local`或者`sudo /etc/rc....

    android自定义软件盘(数字显示顺序随机)

    6. **服务启动和关闭**:在应用程序中,需要设置启动和关闭自定义软键盘的逻辑。这通常通过调用`InputMethodManager`的相关方法来实现。 在项目压缩包`keydemo`中,可能包含了实现这个功能的代码文件,包括`...

    流程自定义

    在IT行业中,流程自定义是一项重要的技术,尤其是在开发企业级应用程序时。ASP.NET,作为微软提供的一个强大且灵活的Web应用程序框架,为开发者提供了丰富的工具和功能,其中包括流程自定义能力。本文将深入探讨如何...

    自定义plymouth主题开发指南

    在Linux系统中, plymouth是一款用于提供启动时图形界面的工具,它可以在系统启动和关闭过程中显示动画或静态图像,从而提升用户体验。本教程将详细讲解如何开发自定义的plymouth主题,让你能够根据个人喜好或者企业...

    自定义struts(实现拦截器)

    在`mystruts.xml`文件中,你可以定义拦截器栈,指定Action执行时应遵循的拦截器顺序。这允许你灵活地控制请求的处理流程。 7. **结果类型(Result)**: - 结果类型定义了Action执行完成后如何展示结果。Struts2...

Global site tag (gtag.js) - Google Analytics