zoukankan      html  css  js  c++  java
  • Jboss EAP:native management API学习

    上一节已经学习了CLI命令行来控制JBOSS,如果想在程序中以编码方式来控制JBOSS,可以参考下面的代码,实际上在前面的文章,用代码控制Jboss上的DataSource,已经有所接触了,API与CLI是完全等价的,一个是人工敲指令,一个是代码控制,二者最终的效果一致。

    import com.sun.javafx.sg.PGShape;
    import org.jboss.as.controller.client.ModelControllerClient;
    import org.jboss.as.controller.client.helpers.ClientConstants;
    import org.jboss.dmr.ModelNode;
    import org.junit.Test;
    
    import javax.security.auth.callback.*;
    import javax.security.sasl.RealmCallback;
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class JBossClient {
    
        private String host = "172.16.38.***";
        private int port = 9999;
        private String userid = "jimmy";
        private String password = "*****";
    
        @Test
        public void testGetServers() {
            //相当于CLI命令行: ls /host=master/server-config
            List<String> servers = getServers("master");
            for (String s : servers) {
                System.out.println(s);
            }
        }
    
        @Test
        public void getServerStatus() {
            //相当于CLI命令行:/host=master/server=server-one:read-attribute(name=server-state)
            System.out.println(getServerStatus("master", "server-one"));
            //相当于CLI命令行:/host=master/server-config=server-one:read-attribute(name=status)
            System.out.println(getServerStatus2("master", "server-one"));
        }
    
        @Test
        public void testStartServer() {
            //相当于CLI命令行:/host=master/server-config=server-one:start
            System.out.println(startServer("master", "server-one"));
        }
    
        @Test
        public void testStopServer() {
            //相当于CLI命令行:/host=master/server-config=server-one:stop
            System.out.println(stopServer("master", "server-one"));
        }
    
        /**
         * 获取指定服务器运行状态
         * @param hostName
         * @param serverName
         * @return
         */
        public String getServerStatus(String hostName, String serverName) {
            String status = "unknown";
            ModelControllerClient client = null;
            try {
                client = createClient(InetAddress.getByName(host), port, userid, password.toCharArray(), "ManagementRealm");
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
                System.out.println("UHE: " + uhe.getMessage());
            }
            try {
                ModelNode op = new ModelNode();
                op.get(ClientConstants.OP).set(ClientConstants.READ_ATTRIBUTE_OPERATION);
                op.get(ClientConstants.OP_ADDR).add("host", hostName);
                op.get(ClientConstants.OP_ADDR).add("server", serverName);
                op.get("name").set("server-state");
    
                status = client.execute(op).get(ClientConstants.RESULT).asString();
    
                if (client != null) client.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Exception: " + e.getMessage());
            }
    
            return status;
        }
    
    
        /**
         * 另一种获取服务器运行状态的方法
         * @param hostName
         * @param serverName
         * @return
         */
        public String getServerStatus2(String hostName, String serverName) {
            String status = "unknown";
            ModelControllerClient client = null;
            try {
                client = createClient(InetAddress.getByName(host), port, userid, password.toCharArray(), "ManagementRealm");
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
                System.out.println("UHE: " + uhe.getMessage());
            }
            try {
                ModelNode op = new ModelNode();
                op.get(ClientConstants.OP).set(ClientConstants.READ_ATTRIBUTE_OPERATION);
                op.get(ClientConstants.OP_ADDR).add("host", hostName);
                op.get(ClientConstants.OP_ADDR).add("server-config", serverName);
                op.get("name").set("status");
    
                status = client.execute(op).get(ClientConstants.RESULT).asString();
    
                if (client != null) client.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Exception: " + e.getMessage());
            }
    
            return status;
        }
    
        /**
         * 启动指定服务器
         *
         * @param hostName
         * @param serverName
         */
        public ModelNode startServer(String hostName, String serverName) {
    
            ModelControllerClient client = null;
            ModelNode returnVal = null;
            try {
                client = createClient(InetAddress.getByName(host), port, userid, password.toCharArray(), "ManagementRealm");
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
                System.out.println("UHE: " + uhe.getMessage());
            }
            try {
                ModelNode op = new ModelNode();
                op.get(ClientConstants.OP).set("start");
                op.get(ClientConstants.OP_ADDR).add("host", hostName);
                op.get(ClientConstants.OP_ADDR).add("server-config", serverName);
    
                returnVal = client.execute(op).get(ClientConstants.RESULT);
    
                if (client != null) client.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Exception: " + e.getMessage());
            }
    
            return returnVal;
    
        }
    
    
        /**
         * 停止指定服务器
         *
         * @param hostName
         * @param serverName
         */
        public ModelNode stopServer(String hostName, String serverName) {
    
            ModelControllerClient client = null;
            ModelNode returnVal = null;
            try {
                client = createClient(InetAddress.getByName(host), port, userid, password.toCharArray(), "ManagementRealm");
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
                System.out.println("UHE: " + uhe.getMessage());
            }
            try {
                ModelNode op = new ModelNode();
                op.get(ClientConstants.OP).set("stop");
                op.get(ClientConstants.OP_ADDR).add("host", hostName);
                op.get(ClientConstants.OP_ADDR).add("server-config", serverName);
                returnVal = client.execute(op).get(ClientConstants.RESULT);
                if (client != null) client.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Exception: " + e.getMessage());
            }
    
            return returnVal;
    
        }
    
    
        /**
         * 获取指定host下的所有server
         *
         * @param hostName
         * @return
         */
        public List<String> getServers(String hostName) {
            List<String> servers = new ArrayList<String>();
            ModelControllerClient client = null;
            try {
                client = createClient(InetAddress.getByName(host), 9999, userid, password.toCharArray(), "ManagementRealm");
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
                System.out.println("UHE: " + uhe.getMessage());
            }
            try {
                ModelNode op = new ModelNode();
                op.get(ClientConstants.OP).set(ClientConstants.READ_RESOURCE_OPERATION);
                op.get(ClientConstants.OP_ADDR).add("host", hostName);
                List<ModelNode> returnVal = client.execute(op).get(ClientConstants.RESULT).get("server-config").asList();
    
                for (ModelNode _ : returnVal) {
                    servers.add(_.asProperty().getName());
                }
    
                if (client != null) client.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Exception: " + e.getMessage());
            }
            return servers;
        }
    
    
        private ModelControllerClient createClient(final InetAddress host, final int port, final String username, final char[] password, final String securityRealmName) {
            final CallbackHandler callbackHandler = new CallbackHandler() {
                public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                    for (Callback current : callbacks) {
                        if (current instanceof NameCallback) {
                            NameCallback ncb = (NameCallback) current;
                            ncb.setName(username);
                        } else if (current instanceof PasswordCallback) {
                            PasswordCallback pcb = (PasswordCallback) current;
                            //pcb.setPassword("admin123".toCharArray());
                            pcb.setPassword(password);
                        } else if (current instanceof RealmCallback) {
                            RealmCallback rcb = (RealmCallback) current;
                            rcb.setText(rcb.getDefaultText());
                        } else {
                            throw new UnsupportedCallbackException(current);
                        }
                    }
                }
            };
            return ModelControllerClient.Factory.create(host, port, callbackHandler);
        }
    }
    

    除了native managent API外,jboss还提供了一套基于http的REST风格API,即9990端口对应的API,有兴趣的可以参考下面的文章

    https://docs.jboss.org/author/display/AS71/The+HTTP+management+API

    https://docs.jboss.org/author/display/AS71/The+native+management+API

    GitHub有一个开源项目,从手机上管理jboss,就是基于http的这一套API实现的,技术上讲 ,利用这二套API,完全可以自己定制一套Jboss管理控制台(不管是c/s还是b/s)

    最后送点福利,GitHub上的开源项目jboss-controller-operation-executor,我在原来的基础上,增加了几个domain模式下的控制方法,包括 停止/启用某一台服务器、获取服务器状态、停止/启用某个ServerGroup下所有Server,并增加了单元测试的示例代码,并将pom依赖项,升级到7.5,以兼容JBOSS EAP 6.4

    项目地址:https://github.com/yjmyzz/jboss-controller-operation-executor

    示例代码:https://github.com/yjmyzz/jboss-controller-operation-executor/blob/master/src/test/java/uk/co/techblue/jboss/test/UnitTest.java

  • 相关阅读:
    oracle实例的内存(SGA和PGA)调整,优化数据库性能
    Redhat 安装perl模块
    三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解
    二、Java基础--02
    一、Java基础--01
    提醒用户收到短信
    手机屏幕更改
    查看手机信息和SIM卡信息
    还原和设置手机桌面背景
    wifi的开与关
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/4756177.html
Copyright © 2011-2022 走看看