You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tubemq.apache.org by yu...@apache.org on 2021/01/29 10:07:10 UTC

[incubator-tubemq] 12/49: [TUBEMQ-447] Add Broker-Admin Cli (#347)

This is an automated email from the ASF dual-hosted git repository.

yuanbo pushed a commit to branch TUBEMQ-421
in repository https://gitbox.apache.org/repos/asf/incubator-tubemq.git

commit 95654835a0de3326f2842a764356b4c0e3b32022
Author: gosonzhang <46...@qq.com>
AuthorDate: Fri Dec 11 19:15:15 2020 +0800

    [TUBEMQ-447] Add Broker-Admin Cli (#347)
    
    Co-authored-by: gosonzhang <go...@tencent.com>
---
 bin/tubemq-broker-admin.sh                         |  40 ++++++++
 pom.xml                                            |  15 +++
 tubemq-server/pom.xml                              |   6 +-
 .../server/broker/web/AbstractWebHandler.java      |   8 +-
 .../server/broker/web/BrokerAdminServlet.java      |  19 ++++
 .../tubemq/server/common/fielddef/CliArgDef.java   |  20 ++--
 .../tubemq/server/common/fielddef/WebFieldDef.java |  12 ++-
 .../tubemq/server/common/utils/HttpUtils.java      | 112 ++++++++++++++++++++
 .../server/common/webbase/WebMethodMapper.java     |   9 ++
 .../server/master/web/action/screen/Webapi.java    |   6 +-
 .../tubemq/server/tools/cli/CliAbstractBase.java   |   2 +-
 .../tubemq/server/tools/cli/CliBrokerAdmin.java    | 113 +++++++++++++++++++++
 .../tubemq/server/tools/cli/CliConsumer.java       |   6 +-
 .../tubemq/server/tools/cli/CliProducer.java       |   6 +-
 14 files changed, 355 insertions(+), 19 deletions(-)

diff --git a/bin/tubemq-broker-admin.sh b/bin/tubemq-broker-admin.sh
new file mode 100644
index 0000000..b1cedf5
--- /dev/null
+++ b/bin/tubemq-broker-admin.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+if [ -z "$BASE_DIR" ] ; then
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+  BASE_DIR=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  BASE_DIR=`cd "$BASE_DIR" && pwd`
+  #echo "TubeMQ master is at $BASE_DIR"
+fi
+source $BASE_DIR/bin/env.sh
+$JAVA $TOOLS_ARGS org.apache.tubemq.server.tools.cli.CliBrokerAdmin $@
diff --git a/pom.xml b/pom.xml
index bfc2b64..f9b7342 100644
--- a/pom.xml
+++ b/pom.xml
@@ -335,6 +335,11 @@
                 <version>2.6</version>
             </dependency>
             <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>4.5.2</version>
+            </dependency>
+            <dependency>
                 <groupId>commons-io</groupId>
                 <artifactId>commons-io</artifactId>
                 <version>2.1</version>
@@ -436,6 +441,16 @@
                 <version>1.7</version>
             </dependency>
             <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-server</artifactId>
+                <version>9.4.31.v20200723</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-servlet</artifactId>
+                <version>9.4.31.v20200723</version>
+            </dependency>
+            <dependency>
                 <groupId>org.ini4j</groupId>
                 <artifactId>ini4j</artifactId>
                 <version>0.5.1</version>
diff --git a/tubemq-server/pom.xml b/tubemq-server/pom.xml
index a4b6d39..985a166 100644
--- a/tubemq-server/pom.xml
+++ b/tubemq-server/pom.xml
@@ -185,14 +185,16 @@
             <artifactId>commons-cli</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-server</artifactId>
-            <version>9.4.31.v20200723</version>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-servlet</artifactId>
-            <version>9.4.31.v20200723</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/AbstractWebHandler.java b/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/AbstractWebHandler.java
index b44d88c..aece762 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/AbstractWebHandler.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/AbstractWebHandler.java
@@ -17,9 +17,11 @@
 
 package org.apache.tubemq.server.broker.web;
 
+import static org.apache.tubemq.server.common.webbase.WebMethodMapper.getRegisteredWebMethod;
 import static org.apache.tubemq.server.common.webbase.WebMethodMapper.getWebApiRegInfo;
 import static org.apache.tubemq.server.common.webbase.WebMethodMapper.registerWebMethod;
 import java.io.IOException;
+import java.util.List;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -42,6 +44,10 @@ public abstract class AbstractWebHandler extends HttpServlet {
         doPost(req, resp);
     }
 
+    public List<String> getSupportedMethod() {
+        return getRegisteredWebMethod();
+    }
+
     @Override
     protected void doPost(HttpServletRequest req,
                           HttpServletResponse resp) throws IOException {
@@ -56,7 +62,7 @@ public abstract class AbstractWebHandler extends HttpServlet {
                 WebApiRegInfo webApiRegInfo = getWebApiRegInfo(true, method);
                 if (webApiRegInfo == null) {
                     strBuffer.append("{\"result\":false,\"errCode\":400,\"errMsg\":\"")
-                            .append("Unsupported method ").append(method).append("}");
+                            .append("Unsupported method ").append(method).append("\"}");
                 } else {
                     strBuffer = (StringBuilder) webApiRegInfo.method.invoke(webApiRegInfo.webHandler, req);
                 }
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/BrokerAdminServlet.java b/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/BrokerAdminServlet.java
index ab43c2e..dfb8b2d 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/BrokerAdminServlet.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/broker/web/BrokerAdminServlet.java
@@ -68,6 +68,25 @@ public class BrokerAdminServlet extends AbstractWebHandler {
         // manual set offset
         innRegisterWebMethod("admin_manual_set_current_offset",
                 "adminManualSetCurrentOffSet");
+        // get all registered methods
+        innRegisterWebMethod("admin_get_methods",
+                "adminQueryAllMethods");
+    }
+
+    public StringBuilder adminQueryAllMethods(HttpServletRequest req) throws Exception {
+        int index = 0;
+        List<String> methods = getSupportedMethod();
+        StringBuilder sBuilder = new StringBuilder(1024);
+        sBuilder.append("{\"result\":true,\"errCode\":0,\"errMsg\":\"Success!\",\"dataSet\":[");
+        for (index = 0; index < methods.size(); index++) {
+            if (index > 0) {
+                sBuilder.append(",");
+            }
+            sBuilder.append("{\"id\":").append(index + 1)
+                    .append(",\"method\":\"").append(methods.get(index)).append("\"}");
+        }
+        sBuilder.append("],\"totalCnt\":").append(index + 1).append("}");
+        return sBuilder;
     }
 
     /***
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/CliArgDef.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/CliArgDef.java
index abb2e2a..2e39f2f 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/CliArgDef.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/CliArgDef.java
@@ -30,12 +30,12 @@ public enum CliArgDef {
     MASTERSERVER(null, "master-servers",
             "String: format is master1_ip:port[,master2_ip:port]",
             "The master address(es) to connect to."),
-    MASTERURL(null, "master-url",
-            "String: format is http://master_ip:master_webport/",
-            "Master Service URL to which to connect.(default: http://localhost:8080/)"),
-    BROKERURL(null, "broker-url",
-            "String: format is http://broker_ip:broker_webport/",
-            "Broker Service URL to which to connect.(default: http://localhost:8081/)"),
+    MASTERPORTAL(null, "master-portal",
+            "String: format is master_ip:master_webport",
+            "Master Service portal to which to connect.(default: 127.0.0.1:8080)"),
+    BROKERPORTAL(null, "broker-portal",
+            "String: format is broker_ip:broker_webport",
+            "Broker Service URL to which to connect.(default: 127.0.0.1:8081)"),
     MESSAGES(null, "messages",
             "Long: count",
             "The number of messages to send or consume, If not set, production or consumption is continual."),
@@ -95,7 +95,13 @@ public enum CliArgDef {
     SYNCPRODUCE(null, "sync-produce",
             "Synchronous production. (default: false)"),
     WITHOUTDELAY(null, "without-delay",
-                        "Production without delay. (default: false)");
+            "Production without delay. (default: false)"),
+    METHOD(null, "method",
+            "String: http call method",
+            "Http call method"),
+    ADMINMETHOD(null, "show-methods",
+            "Return http's methods.");
+
 
 
 
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java
index 1025ba0..44a6f81 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java
@@ -62,7 +62,11 @@ public enum WebFieldDef {
             "Topic name", TBaseConstants.META_MAX_TOPICNAME_LENGTH,
             RegexDef.TMP_STRING),
     COMPSPARTITIONID(12, "partitionId", "pid", WebFieldType.COMPINT,
-            "Partition id", RegexDef.TMP_NUMBER);
+            "Partition id", RegexDef.TMP_NUMBER),
+    CALLERIP(13, "callerIp", "cip", WebFieldType.STRING,
+            "Caller ip address", TBaseConstants.META_MAX_CLIENT_HOSTNAME_LENGTH);
+
+
 
 
 
@@ -86,6 +90,12 @@ public enum WebFieldDef {
     }
 
     WebFieldDef(int id, String name, String shortName, WebFieldType type,
+                String desc, int valMaxLen) {
+        this(id, name, shortName, type, desc, valMaxLen,
+                TBaseConstants.META_VALUE_UNDEFINED, false, null);
+    }
+
+    WebFieldDef(int id, String name, String shortName, WebFieldType type,
                 String desc, RegexDef regexDef) {
         this(id, name, shortName, type, desc,
                 TBaseConstants.META_VALUE_UNDEFINED, regexDef);
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HttpUtils.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HttpUtils.java
new file mode 100644
index 0000000..b600327
--- /dev/null
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HttpUtils.java
@@ -0,0 +1,112 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tubemq.server.common.utils;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.apache.tubemq.corebase.utils.AddressUtils;
+import org.apache.tubemq.corebase.utils.TStringUtils;
+import org.apache.tubemq.server.common.fielddef.WebFieldDef;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+
+/**
+ * This class is used to process http connection and return result conversion,
+ * currently does not support https
+ */
+public class HttpUtils {
+    // log printer
+    private static final Logger logger =
+            LoggerFactory.getLogger(HttpUtils.class);
+
+
+    /* Send request to target server. */
+    public static JsonObject requestWebService(String url,
+                                               Map<String, String> inParamMap) throws Exception {
+        if (url == null) {
+            throw new Exception("Web service url is null!");
+        }
+        if (url.trim().toLowerCase().startsWith("https://")) {
+            throw new Exception("Unsupported https protocol!");
+        }
+        // process business parameters
+        ArrayList<BasicNameValuePair> params = new ArrayList<>();
+        if (inParamMap != null && !inParamMap.isEmpty()) {
+            for (Map.Entry<String, String> entry : inParamMap.entrySet()) {
+                params.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
+            }
+            if (inParamMap.containsKey(WebFieldDef.CALLERIP.shortName)
+                    || inParamMap.containsKey(WebFieldDef.CALLERIP.name)) {
+                params.add(new BasicNameValuePair(WebFieldDef.CALLERIP.name,
+                        AddressUtils.getIPV4LocalAddress()));
+            }
+        }
+        // build connect configure
+        RequestConfig requestConfig = RequestConfig.custom()
+                .setConnectTimeout(50000).setSocketTimeout(60000).build();
+        // build HttpClient and HttpPost objects
+        CloseableHttpClient httpclient = null;
+        HttpPost httpPost = null;
+        JsonObject jsonRes = null;
+        JsonParser jsonParser = new JsonParser();
+        try {
+            httpclient = HttpClients.custom()
+                    .setDefaultRequestConfig(requestConfig).build();
+            httpPost = new HttpPost(url);
+            UrlEncodedFormEntity se = new UrlEncodedFormEntity(params);
+            httpPost.setEntity(se);
+            // send http request and process response
+            CloseableHttpResponse response = httpclient.execute(httpPost);
+            String returnStr = EntityUtils.toString(response.getEntity());
+            if (TStringUtils.isNotBlank(returnStr)
+                    && response.getStatusLine().getStatusCode() == 200) {
+                jsonRes = jsonParser.parse(returnStr).getAsJsonObject();
+            }
+        } catch (Throwable e) {
+            throw new Exception("Connecting " + url + " throw an error!", e);
+        } finally {
+            if (httpPost != null) {
+                httpPost.releaseConnection();
+            }
+            if (httpclient != null) {
+                try {
+                    httpclient.close();
+                } catch (IOException ie) {
+                    logger.error("Close HttpClient error.", ie);
+                }
+            }
+        }
+        return jsonRes;
+    }
+
+}
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/webbase/WebMethodMapper.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/webbase/WebMethodMapper.java
index a856014..83e0472 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/common/webbase/WebMethodMapper.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/webbase/WebMethodMapper.java
@@ -18,7 +18,9 @@
 package org.apache.tubemq.server.common.webbase;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,6 +69,13 @@ public class WebMethodMapper {
                 .append(webHandler.getClass().getName()).toString());
     }
 
+    public static List<String> getRegisteredWebMethod() {
+        List<String> methods = new ArrayList<>();
+        methods.addAll(WEB_QRY_METHOD_MAP.keySet());
+        methods.addAll(WEB_MDY_METHOD_MAP.keySet());
+        return methods;
+    }
+
 
 
     public static class WebApiRegInfo {
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/action/screen/Webapi.java b/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/action/screen/Webapi.java
index 5d4de04..5c5bb3f 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/action/screen/Webapi.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/action/screen/Webapi.java
@@ -105,7 +105,7 @@ public class Webapi implements Action {
             WebMethodMapper.WebApiRegInfo webApiRegInfo = getWebApiRegInfo(isQuery, method);
             if (webApiRegInfo == null) {
                 strBuffer.append("{\"result\":false,\"errCode\":400,\"errMsg\":\"Unsupported method: ")
-                        .append(method).append("}");
+                        .append(method).append("\"}");
                 requestContext.put("sb", strBuffer.toString());
             } else {
 
@@ -120,8 +120,8 @@ public class Webapi implements Action {
                 }
             }
         } catch (Throwable e) {
-            strBuffer.append("{\"result\":false,\"errCode\":400,\"errMsg\":\"Bad request from client :")
-                    .append(e.getMessage()).append("}");
+            strBuffer.append("{\"result\":false,\"errCode\":400,\"errMsg\":\"Bad request from client, ")
+                    .append(e.getMessage()).append("\"}");
             requestContext.put("sb", strBuffer.toString());
         }
     }
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliAbstractBase.java b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliAbstractBase.java
index c0903f2..0a0953d 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliAbstractBase.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliAbstractBase.java
@@ -71,6 +71,6 @@ public abstract class CliAbstractBase {
     protected abstract void initCommandOptions();
 
 
-    public abstract boolean parseParams(String[] args) throws Exception;
+    public abstract boolean processParams(String[] args) throws Exception;
 
 }
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliBrokerAdmin.java b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliBrokerAdmin.java
new file mode 100644
index 0000000..695ef68
--- /dev/null
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliBrokerAdmin.java
@@ -0,0 +1,113 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tubemq.server.tools.cli;
+
+import com.google.gson.JsonObject;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.ParseException;
+import org.apache.tubemq.corebase.utils.TStringUtils;
+import org.apache.tubemq.server.common.fielddef.CliArgDef;
+import org.apache.tubemq.server.common.utils.HttpUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+
+/**
+ * This class is use to process CLI Broker Admin process.
+ *
+ *
+ */
+public class CliBrokerAdmin extends CliAbstractBase {
+
+    private static final Logger logger =
+            LoggerFactory.getLogger(CliBrokerAdmin.class);
+
+    private static final String defBrokerPortal = "127.0.0.1:8081";
+
+
+    public CliBrokerAdmin() {
+        super("tubemq-broker-admin.sh");
+        initCommandOptions();
+    }
+
+    /**
+     * Init command options
+     */
+    protected void initCommandOptions() {
+        // add the cli required parameters
+        addCommandOption(CliArgDef.BROKERPORTAL);
+        addCommandOption(CliArgDef.ADMINMETHOD);
+        addCommandOption(CliArgDef.METHOD);
+
+    }
+
+    public boolean processParams(String[] args) throws Exception {
+        // parse parameters and check value
+        CommandLine cli = parser.parse(options, args);
+        if (cli == null) {
+            throw new ParseException("Parse args failure");
+        }
+        if (cli.hasOption(CliArgDef.VERSION.longOpt)) {
+            version();
+        }
+        if (cli.hasOption(CliArgDef.HELP.longOpt)) {
+            help();
+        }
+        String brokerAddr = defBrokerPortal;
+        if (cli.hasOption(CliArgDef.BROKERPORTAL.longOpt)) {
+            brokerAddr = cli.getOptionValue(CliArgDef.BROKERPORTAL.longOpt);
+            if (TStringUtils.isBlank(brokerAddr)) {
+                throw new Exception(CliArgDef.BROKERPORTAL.longOpt + " is required!");
+            }
+        }
+        JsonObject result = null;
+        Map<String, String> inParamMap = new HashMap<>();
+        String brokerUrl = "http://" + brokerAddr + "/broker.htm";
+        if (cli.hasOption(CliArgDef.ADMINMETHOD.longOpt)) {
+            inParamMap.put(CliArgDef.METHOD.longOpt, "admin_get_methods");
+            result = HttpUtils.requestWebService(brokerUrl, inParamMap);
+            System.out.println(result.toString());
+            System.exit(0);
+        }
+        String methodStr = cli.getOptionValue(CliArgDef.METHOD.longOpt);
+        if (TStringUtils.isBlank(methodStr)) {
+            throw new Exception(CliArgDef.METHOD.longOpt + " is required!");
+        }
+        inParamMap.put(CliArgDef.METHOD.longOpt, methodStr);
+        result = HttpUtils.requestWebService(brokerUrl, inParamMap);
+        System.out.println(result.toString());
+        return true;
+    }
+
+    public static void main(String[] args) {
+        CliBrokerAdmin cliBrokerAdmin = new CliBrokerAdmin();
+        try {
+            cliBrokerAdmin.processParams(args);
+        } catch (Throwable ex) {
+            ex.printStackTrace();
+            logger.error(ex.getMessage());
+            cliBrokerAdmin.help();
+        }
+
+    }
+
+
+}
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliConsumer.java b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliConsumer.java
index 359ea44..c8938a6 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliConsumer.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliConsumer.java
@@ -90,6 +90,7 @@ public class CliConsumer extends CliAbstractBase {
     /**
      * Init command options
      */
+    @Override
     protected void initCommandOptions() {
         // add the cli required parameters
         addCommandOption(CliArgDef.MASTERSERVER);
@@ -105,7 +106,8 @@ public class CliConsumer extends CliAbstractBase {
         addCommandOption(CliArgDef.OUTPUTINTERVAL);
     }
 
-    public boolean parseParams(String[] args) throws Exception {
+    @Override
+    public boolean processParams(String[] args) throws Exception {
         // parse parameters and check value
         CommandLine cli = parser.parse(options, args);
         if (cli == null) {
@@ -364,7 +366,7 @@ public class CliConsumer extends CliAbstractBase {
     public static void main(String[] args) {
         CliConsumer cliConsumer = new CliConsumer();
         try {
-            boolean result = cliConsumer.parseParams(args);
+            boolean result = cliConsumer.processParams(args);
             if (!result) {
                 throw new Exception("Parse parameters failure!");
             }
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliProducer.java b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliProducer.java
index 2734ac1..1b2f25a 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliProducer.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/tools/cli/CliProducer.java
@@ -93,6 +93,7 @@ public class CliProducer extends CliAbstractBase {
     /**
      * Init command options
      */
+    @Override
     protected void initCommandOptions() {
         // add the cli required parameters
         addCommandOption(CliArgDef.MASTERSERVER);
@@ -110,7 +111,8 @@ public class CliProducer extends CliAbstractBase {
         addCommandOption(CliArgDef.WITHOUTDELAY);
     }
 
-    public boolean parseParams(String[] args) throws Exception {
+    @Override
+    public boolean processParams(String[] args) throws Exception {
         // parse parameters and check value
         CommandLine cli = parser.parse(options, args);
         if (cli == null) {
@@ -348,7 +350,7 @@ public class CliProducer extends CliAbstractBase {
     public static void main(String[] args) {
         CliProducer cliProducer = new CliProducer();
         try {
-            boolean result = cliProducer.parseParams(args);
+            boolean result = cliProducer.processParams(args);
             if (!result) {
                 throw new Exception("Parse parameters failure!");
             }