美文网首页
根据配置执行jmx文件浅析(一)--获取配置信息

根据配置执行jmx文件浅析(一)--获取配置信息

作者: nzdnllm | 来源:发表于2019-03-03 11:38 被阅读0次

    首先回顾一下页面关于执行配置的代码,其中onClick事件会触发开始监控startMonitor()方法

    <div class="row" id="operArea" style="display: none;">
        <div class="col-md-2">
            <button id="startMonitorBtn" type="button" class="btn btn-warning" onClick="startMonitor()">开始监控</button>
        </div>
        <div class="col-md-2">
            <div class="input-group">
                <span class="input-group-addon">监控频率(秒)</span>
                <input name="monitorFreq" id="monitorFreq" type="text" class="form-control" placeholder="30">
            </div>
        </div>
        <div class="col-md-3">
            <div class="input-group">
                <span class="input-group-addon">
                    <input name="smsValue" id="smsValue" type="checkbox" checked="checked">
                </span>
                <span class="input-group-addon">是否需要短信提醒</span>
            </div>
        </div>  
    </div>
    

    那么接下来我们就要实现开始监控和停止监控的方法startMonitor() --js

    // 开始监控 
        var inter;
        function startMonitor() {
            
            url = "runmonitorcases";
            $.post(
                url,
                {  //参数 lineName 业务线名称,;frequency 监控频率;smsValue 是否发送短信;
                    "lineName" : document.getElementById("dropDownToggleName").text,
                    "frequency" : document.getElementById("monitorFreq").value,
                    "smsValue" : document.getElementById("smsValue").checked
                },
                function(data) {
                    
                    if(data.status == "1") {
                        document.getElementById("startMonitorBtn").innerText = "停止监控"
                        document.getElementById("monitorFreq").disabled = true;
                        document.getElementById("smsValue").disabled = true;
                        //获取监控时长(s)并转换为int类型
                        var frequency=document.getElementById("monitorFreq").value;
                        var fre=parseInt(frequency);
                        //调用监控
                        inter=setInterval("runcase()",fre*1000);                                
                    } else {
                        document.getElementById("startMonitorBtn").innerText = "开始监控"
                        document.getElementById("monitorFreq").disabled = true;
                        window.clearInterval(inter);
                        
                    }
                    
                }, "json")
            
        } 
    

    说明:
    我们的期望:当前页面每1min执行1次当前业务线的所有测试用例,并返回结果给前端查看
    曾尝试在后端执行,但是当前框架无法实现刷新前端页面并展示,主要是因为我比较小白。。
    最终选定了使用setInterval()方法,在前端控制执行频率,也达到我们的预期的效果
    逻辑如下:
    1.点击startMonitor(),改变执行状态,并返回
    2.获取执行状态
    若为执行状态,使用setinterval()方法,按照执行频率调用runcase()方法
    若为停止执行状态,使用clearInterval()方法终止调用runcase()方法
    3.runcase()方法执行jmx文件并输出结果并返回

    web.xml配置

    <servlet>
            <servlet-name>runmonitorcases</servlet-name>
            <servlet-class>com.xxx.servlet.RunStartMonitorCasesServlet</servlet-class>
            <init-param>
                <param-name>monitorCaseRootPath</param-name>
                <param-value>此处配置jmx存放地址</param-value>
            </init-param>
            <init-param>
                <param-name>jmeterCommand</param-name>
                <param-value>此处配置jmeter执行文件地址</param-value>
            </init-param>
            <!-- 设置结果文件存储路径 -->
            <init-param>
                <param-name>caseResultPath</param-name>
                <param-value>此处配置jmeter执行结果文件存放地址</param-value>
            </init-param>
    </servlet>
    <servlet-mapping>
            <servlet-name>runmonitorcases</servlet-name>
            <url-pattern>/runmonitorcases</url-pattern>
    </servlet-mapping>
    

    配置完成后我们就可以实现RunStartMonitorCasesServlet这个接口

    package com.xxx.servlet;
    
    import java.io.*;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Arrays;
    import java.util.Timer;
    import javafx.concurrent.Task;
    import javax.servlet.http.*;
    import org.apache.log4j.Logger;
    import javax.servlet.*;
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    public class RunStartMonitorCasesServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        ServletConfig config = null; // 定义一个ServletConfig对象
        private String sqlDriverName = ""; // 定义的JDBC驱动名
        private String sqlAddr = ""; // 定义的数据库地址
        private String sqlUsername = ""; // 定义的数据库用户名
        private String sqlPassword = ""; // 定义的数据库连接密码
        private String sqlDbName = ""; // 定义的数据库名
        private String monitorCaseRootPath = "";
        private String jmeterCommand = "";
        private String caseResultPath="";
        
        public void init(ServletConfig config) throws ServletException {
            super.init(config); // 继承父类的init()方法
            this.config = config; // 获取配置信息
            monitorCaseRootPath = config.getInitParameter("monitorCaseRootPath");//获取jmx文件地址
            jmeterCommand = config.getInitParameter("jmeterCommand");//获取jmeter执行文件地址
            caseResultPath=config.getInitParameter("caseResultPath");//获取结果文件存放地址
        }
    
        public void doGet(HttpServletRequest req, HttpServletResponse res)
                throws ServletException, IOException {
            doPost(req, res);
        }
        
        public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
            res.setContentType("application/json; charset=utf-8");
                  //获取接口参数
            String lineName = req.getParameter("lineName");
            String frequency = req.getParameter("frequency");
    
            PrintWriter out = res.getWriter();
            
            try {
                JSONObject jsonObject = new JSONObject();
                //获取业务线设置 
                sqlDriverName = getServletContext().getInitParameter("driverName");// 从配置文件中获取JDBC驱动名
                sqlAddr = getServletContext().getInitParameter("addr");// 从配置文件中获取数据库地址
                sqlUsername = getServletContext().getInitParameter("username"); // 获取数据库用户名
                sqlPassword = getServletContext().getInitParameter("password"); // 获取数据库连接密码
                sqlDbName = getServletContext().getInitParameter("dbName"); // 获取要连接的数据库
                //创建计数文件,并将计数设置为0
                File countFile=new File(caseResultPath+lineName+"countFile.txt");
                if(countFile.exists()) {
                    FileWriter fw = new FileWriter(countFile);
                    fw.close();
                }
                // 获取文件列表
                File rootFolder = new File(monitorCaseRootPath + lineName);
                File[] tempFileList = rootFolder.listFiles();
                int count=0;
                for (int i = 0; i < tempFileList.length; i++) {
                    // 仅处理文件
                    if (tempFileList[i].isFile() && tempFileList[i].toString().endsWith(".jmx")  ) {
                        count++;
                        //写入各个用例的计数
                        FileWriter fw = new FileWriter(countFile,true);
                        fw.write(lineName+"_countnum_caseFail"+count+"=0");
                        fw.write('\n');
                        fw.write(lineName+"_countnum_readFail"+count+"=0");
                        fw.write('\n');
                        fw.close();
                    }
                }
        
                String url = "jdbc:mysql://" + sqlAddr + "/" + sqlDbName + "?useSSL=false";
                Class.forName(sqlDriverName);
                Connection conn = DriverManager.getConnection(url, sqlUsername, sqlPassword);
                Statement stmt = conn.createStatement();
                String sql = "select status from monitor_settings where bzname='" + lineName + "'";
                ResultSet rs = stmt.executeQuery(sql);
                int status = 0;
                while (rs.next()) {
                    status = rs.getInt(1);
                    if (status == 1) {
                        status = 0;
                    } else {
                        status = 1;
                    }
                    jsonObject.put("status", status);
                }
                
                String updateSql="update monitor_settings set frequency=?,status=? where bzname=?";
                PreparedStatement p = conn.prepareStatement(updateSql);
                p.setInt(1, Integer.valueOf(frequency));
                p.setInt(2, status);
                p.setString(3, lineName);
                p.executeUpdate();
                p.close();
                
                System.out.println(jsonObject.toString());
                out.write(jsonObject.toString());            
            
                rs.close();
                stmt.close();
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
                out.println(e.toString());
            }
            out.close();
        }
    }
    

    说明:
    上述代码中存在创建计数文件,原因是因为我们要实现对接口的监控,每发生一次错误就给用户发送邮件会对资源造成浪费,所以我们设定需要发生到一定数量进行发送邮件,在这里进行技术文件的初始化

    相关文章

      网友评论

          本文标题:根据配置执行jmx文件浅析(一)--获取配置信息

          本文链接:https://www.haomeiwen.com/subject/tedzyqtx.html