zoukankan      html  css  js  c++  java
  • rocketmq番外篇(一):开发命令行

    匠心零度 转载请注明原创出处,谢谢!

    说在前面

    虽然是以rocketmq引出的开发命令行,但是任何java应用如果需要都可以借鉴引用,也是通用技术。

    主题

    • rocketmq使用例子
    • Apache Commons CLI简介
      • 总览
      • 开发使用
    • rocketmq借助Apache Commons CLI如何开发
    • 结尾

    rocketmq使用例子

    usage: mqbroker [-c <arg>] [-h] [-m] [-n <arg>] [-p]
     -c,--configFile <arg>       Broker config properties file
     -h,--help                   Print help
     -m,--printImportantConfig   Print important config item
     -n,--namesrvAddr <arg>      Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
     -p,--printConfigItem        Print all config item
    

    这种是怎么开发出来的呢?本篇重点就是分析如果用java开发命令行,简单查看代码如下图:


    我们可以知道是借助了 Apache Commons CLI 工具进行开发的。

    Apache Commons CLI简介

    总览

    官网地址:http://commons.apache.org/proper/commons-cli/

    The Apache Commons CLI library provides an API for parsing command line options passed to programs. It's also able to print help messages detailing the options available for a command line tool.
    

    备注:Apache Commons CLI库提供了一个API,用于解析命令行选项传递给程序。也能够帮助打印消息详细选项的命令行工具。

    Apache Commons CLI 支持的格式有:

    • POSIX like options (ie. tar -zxvf foo.tar.gz)
    • GNU like long options (ie. du --human-readable --max-depth=1)
    • Java like properties (ie. java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo)
    • Short options with value attached (ie. gcc -O2 foo.c)
    • long options with single hyphen (ie. ant -projecthelp)

    开发使用

    官网地址:http://commons.apache.org/proper/commons-cli/introduction.html

    想要开发达到上面的效果,需要三步即可:

    • 定义阶段(Definition Stage)
    • 解析阶段(Parsing Stage)
    • 询问阶段(Interrogation Stage)

    定义阶段(Definition Stage)

    主要就是Options以及Option来定义命令有那些,说明是什么,是否必填,是否有参数等。

    解析阶段(Parsing Stage)

    主要就是通过 CommandLineParser解析得到CommandLine对象。

    询问阶段(Interrogation Stage)

    主要就是通过CommandLine获取相关内容信息。

    下面我们结合rocketmq的例子来实现类似功能:

    rocketmq借助Apache Commons CLI如何开发

    我把rocketmq里面代码稍微修改下,之后放在了一个简单的一个类里面就可以显示出来:

    import org.apache.commons.cli.CommandLine;
    import org.apache.commons.cli.CommandLineParser;
    import org.apache.commons.cli.HelpFormatter;
    import org.apache.commons.cli.Option;
    import org.apache.commons.cli.Options;
    import org.apache.commons.cli.ParseException;
    import org.apache.commons.cli.PosixParser;
    
    public class TestCLI {
        public static void main(String[] args) {
    
            //定义阶段(Definition Stage)
            Options options = new Options();
    
            Option opt = new Option("h", "help", false, "Print help");
            opt.setRequired(false);
            options.addOption(opt);
    
            opt =
                new Option("n", "namesrvAddr", true,
                    "Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876");
            opt.setRequired(false);
            options.addOption(opt);
    
            opt = new Option("c", "configFile", true, "Broker config properties file");
            opt.setRequired(false);
            options.addOption(opt);
    
            opt = new Option("p", "printConfigItem", false, "Print all config item");
            opt.setRequired(false);
            options.addOption(opt);
    
            opt = new Option("m", "printImportantConfig", false, "Print important config item");
            opt.setRequired(false);
            options.addOption(opt);
    
            //解析阶段(Parsing Stage)
            CommandLineParser parser =new PosixParser();
            HelpFormatter hf = new HelpFormatter();
            hf.setWidth(110);
            CommandLine commandLine = null;
            try {
                commandLine = parser.parse(options, args);
                if (commandLine.hasOption('h')) {
                    hf.printHelp("mqbroker", options, true);
                    System.exit(-1);
                }
            } catch (ParseException e) {
                hf.printHelp("mqbroker", options, true);
            }
    
            //询问阶段(Interrogation Stage)
            Option[] opts = commandLine.getOptions();
            if (opts != null) {
                for (Option opt1 : opts) {
                    String name = opt1.getLongOpt();
                    String value = commandLine.getOptionValue(name);
                    System.out.println(name + "-----------------:" + value);
                }
            }
        }
    
    }
    
    

    程序运行结果:


    大功告成!!!

    结尾

    今天仅仅只是开始,期待你的持续关注,让我们一起走进rocketmq的世界!!!


    如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!

    加入知识星球,一起探讨!

  • 相关阅读:
    wait/sleep/yield的区别
    54点提高PHP编程效率(转)
    ftp 使用
    转义 html 里特殊含义字符
    查看端口是否被占用
    webservice 获取调用者IP
    字符编码
    你有读过软件的协议或是网站的服务条款吗?
    使用TSQL的Rand函数生成随机数的艰苦历程
    几个.NET方面的问题——参考答案
  • 原文地址:https://www.cnblogs.com/jiangxinlingdu/p/8871686.html
Copyright © 2011-2022 走看看