`
chainhou
  • 浏览: 175272 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由GlassFish V3的启动脚本说起,分析CLI

 
阅读更多
一直想写点内容,一来话太白,写不好,二来肚子里没东西。
思来想去,每天少写点也会有进步的,写点吧。  开始!



以上是tomcat的启动脚本内容,看惯了这类的脚本,你再看看下面这个:


会不有会有点时下流行的“小清新”的感觉。要想知道这么短小的内容就可以启动server,就不得不了解下CLI (Command Line Interface) ,正是cli,才使得启动变得如此简单。

1.CLI

CLI是一系列可以在GlassFish的asadmin工具中执行的命令,以完成各类操作的。下面以启动server的start-domain命令为例来分析GlassFish V3 的CLI。

Java –jar 执行admin-cli.jar,必然会执行这个jar包下的一个带有main方法的类,这个类是:AsadminMain
那万一有多个类包含main方法呢?
当然,可以在jar文件admin-cli.jar\META-INF\MANIFEST.MF文件下指定执行的主类,有如下内容:
Main-Class: com.sun.enterprise.admin.cli.AsadminMain


AsadminMain的main方法:
  
 public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        AsadminMain asadminMain = new AsadminMain();
        int code = asadminMain.doMain(args);
        System.exit(code);
}

同样的短小,再看下主要的doMain方法
protected int doMain(String[] args) {
        int minor = JDK.getMinor();

        if (minor < 6) {
            System.err.println(strings.get("OldJdk", "" + minor));
            return ERROR;
        }
…
    command = args[0];
        int exitCode = executeCommand(args);

public int executeCommand(String[] argv) {
        CLICommand cmd = null;

…
        cmd = CLICommand.getCommand(habitat, command);
            return cmd.execute(argv);

一系列的小方法,读起来也比较好理解。
其中
CLICommand.getCommand(habitat, command);
,是根据用户要执行的command,查询方法定义,方便下面的执行。
/**
     * Get a CLICommand object representing the named command.
     */
    public static CLICommand getCommand(ServiceLocator habitat, String name)
            throws CommandException {

        // first, check if it's a known unsupported command
        checkUnsupportedLegacyCommand(name);

        // next, try to load our own implementation of the command
        CLICommand cmd = habitat.getService(CLICommand.class, name);
        if (cmd != null)
            return cmd;

        // nope, must be a remote command
        logger.finer("Assuming it's a remote command: " + name);
        Environment environment = habitat.getService(Environment.class);
        if (environment != null && environment.getBooleanOption("USE_REST")) {
            logger.finest("AS_ADMIN_USE_REST environment variable is on.");
            return new RemoteCLICommand(name,
                habitat.<ProgramOptions>getService(ProgramOptions.class),
                environment);
        } else {
            return new RemoteCommand(name,
                habitat.<ProgramOptions>getService(ProgramOptions.class),
                environment);
        }
    }

以上是用ServiceLocator来定位相应的Command,接着执行CLICommand的execute方法
public int execute(String... argv) throws CommandException {
        this.argv = argv;
        initializePasswords();
        logger.finer("Prepare");
        prepare();
        logger.finer("Process program options");
        processProgramOptions();
        logger.finer("Parse command options");
        parse();
        if (checkHelp())
            return 0;
        logger.finer("Prevalidate command options");
        prevalidate();
        logger.finer("Inject command options");
        inject();
        logger.finer("Validate command options");
        validate();
        if (programOpts.isEcho()) {
            logger.info(echoCommand());
            // In order to avoid echoing commands used intenally to the
            // implementation of *this* command, we turn off echo after
            // having echoed this command.
            programOpts.setEcho(false);
        } else if (logger.isLoggable(Level.FINER))
            logger.finer(echoCommand());
        logger.finer("Execute command");
        return executeCommand();
    }

protected abstract int executeCommand() throws CommandException;

在该方法中的executeCommand方法会执行子类实现的executeCommand方法。
终于到了具体的方法实现了:
@Service(name = "start-domain")
@PerLookup
public class StartDomainCommand extends LocalDomainCommand implements StartServerCommand 

正是由于@Service的name和用户输入的command一致,ServiceLocator才会找到这个Command并执行,接着执行其executeCommand
@Override
    protected int executeCommand() throws CommandException {
        try {
            // createLauncher needs to go before the helper is created!!
            createLauncher();
            final String mpv = getMasterPassword();
...
   launcher.launch();
           

以上是整个start-domain的过程,也简要分析了cli的执行过程。

2012-12-12
  • 大小: 43.5 KB
  • 大小: 6.1 KB
分享到:
评论

相关推荐

    可扩展GlassFish v3的JavaEE 6

    GlassFish v3 的模块化性能使得它可以快速启动和占用少量资源,因为它会使用延迟加载来启动那些仅仅被要求使用的服务。 简化开发 GlassFish v3 的简化开发是通过 JavaEE 6 来实现的。JavaEE 6 通过使用所有网络 ...

    Sun Glassfish v3 Administration 2009/12 PDF

    - GlassFish v3是基于Java EE规范的应用服务器之一,由Sun Microsystems开发,后被Oracle收购。 - 它支持最新的Java EE 6标准,包括EJB 3.1、JSF 2.0等。 - 版本历史:从iPlanet应用服务器发展而来,经过Sun ONE...

    jmaki development with sun glassfish v3

    本文档旨在介绍如何使用 jMaki 在 Sun GlassFish V3 应用服务器上进行开发,这是由 Sun Microsystems 推出的一个开放源代码的 Java EE 应用服务器。Sun GlassFish V3 是一个高度可扩展、可靠且功能丰富的平台,支持...

    linux下实现glassfish自动启动

    这个脚本定义了启动、停止和重启Glassfish域的命令。 2. **赋予执行权限**: ``` sudo chmod +x /etc/init.d/glassfish ``` ### 配置服务 1. **添加启动服务**: 使用`chkconfig`命令添加服务(对于使用...

    GlassFish v3

    - **定义与背景**:GlassFish v3是一款由Sun Microsystems开发的企业级应用服务器,它基于Java平台标准(Java Platform, Enterprise Edition,简称Java EE)构建。该版本作为GlassFish系列中的一个重要里程碑,在...

    glassfish v3 集群搭建完全手册(自己写的教程)

    《Glassfish集群搭建完全手册》 在IT领域中,服务器集群是提高系统可用性和负载均衡的重要手段。Glassfish,作为一款开源的应用服务器,其集群功能的配置却常常被忽视或处理得不够详尽。本手册旨在弥补这一空缺,...

    Demo - EhCache Distributed Caching With Terracotta in GlassFish v3

    Demo of ehCache distributed caching with terracotta in glassFish v3 可以参考:http://blog.csdn.net/guobin0719/archive/2011/04/25/6361940.aspx

    glassfish v3 application server (I)

    引起鱼猫之争的东东 可与tomcat 媲美,看好它

    glassfish v2 在windows 构建启动服务

    glassfish 安装构建在windows 中自动启动服务。

    glassfish-v3-windows.part1

    glassfish-v3-windows.part1

    eclipse启动多个glassfish资源文件3

    eclipse下启动多个glassfish,内容包含glassfish,ant,构建domain的Build.xml文件

    GlassFish应用案例分析

    GlassFish 应用案例分析 GlassFish 是一个开源的 Java EE 应用服务器,它提供了企业级别的应用服务器解决方案,具有高性能、可靠性和可扩展性等特点。GlassFish 的出现使得 Java EE 应用服务器市场更加繁荣, ...

    glassfish-v3-windows.part4

    glassfish-v3-windows.part4

    glassfish-v3-windows.part2

    glassfish-v3-windows.part2

    eclipse启动多个glassfish资源文件4

    eclipse下启动多个glassfish,内容包含glassfish,ant,构建domain的Build.xml文件

    glassfish v3 application server (II)

    引起鱼猫之争的东东 可与tomcat 媲美,看好它

    基于glassfish的EJBDemo,包含打包脚本,包含客户端

    这些脚本会将源代码编译、打包成JAR或WAR文件,然后准备部署到Glassfish服务器。 5. **部署描述配置文件** 部署描述符(Deployment Descriptor)是XML文件,它提供了关于应用程序的元数据,如安全角色、依赖关系和...

    glassfish安装步骤.txt

    4. **启动Glassfish**:通过执行以下命令来启动Glassfish服务: ``` C:\Downloads\glassfish\bin&gt;asadmin start-domain domain1 ``` 其中`domain1`是你创建的域名称。启动后,可以通过检查日志文件来验证是否...

Global site tag (gtag.js) - Google Analytics