首先回顾一下页面关于执行配置的代码,其中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();
}
}
说明:
上述代码中存在创建计数文件,原因是因为我们要实现对接口的监控,每发生一次错误就给用户发送邮件会对资源造成浪费,所以我们设定需要发生到一定数量进行发送邮件,在这里进行技术文件的初始化
网友评论