 | |  |  | 数据库MYQ业务流程心跳程序启动
- // MYQ业务流程心跳程序
- // 模拟完整的业务操作流程,包括定时任务、数据库操作和状态监控
- print.log("===== MYQ业务流程心跳程序启动 =====");
- // 全局变量
- var conn = null;
- var pstmt = null;
- var heartbeatInterval = null;
- var isRunning = false;
- /**
- * 连接数据库
- */
- function connectDatabase() {
- try {
- var url = "jdbc:mysql://mysql2.sqlpub.com:3307/chaook";
- var user = "chaook";
- var password = "JAVsRUMHkoJ123xJ";
- var params = "?useSSL=false&characterEncoding=utf8";
-
- print.log("正在连接数据库...");
- conn = mysql.getConnection(url, user, password);
- print.log("✅ 数据库连接成功");
- return true;
- } catch (e) {
- print.log("❌ 数据库连接失败: " + e.message);
- return false;
- }
- }
- /**
- * 初始化数据库表结构
- */
- function initializeDatabase() {
- try {
- // 创建设备状态表
- var deviceTableSql = "CREATE TABLE IF NOT EXISTS 设备状态表 (" +
- "设备ID VARCHAR(50) PRIMARY KEY," +
- "设备名称 VARCHAR(100)," +
- "在线状态 TINYINT DEFAULT 0," + // 0-离线, 1-在线
- "最后心跳时间 DATETIME," +
- "CPU使用率 DECIMAL(5,2)," +
- "内存使用率 DECIMAL(5,2)," +
- "磁盘使用率 DECIMAL(5,2)" +
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8";
-
- var stmt = conn.createStatement();
- stmt.executeUpdate(deviceTableSql);
- stmt.close();
-
- // 创建操作日志表
- var logTableSql = "CREATE TABLE IF NOT EXISTS 操作日志表 (" +
- "日志ID INT AUTO_INCREMENT PRIMARY KEY," +
- "设备ID VARCHAR(50)," +
- "操作类型 VARCHAR(50)," +
- "操作详情 TEXT," +
- "操作时间 DATETIME DEFAULT CURRENT_TIMESTAMP," +
- "FOREIGN KEY (设备ID) REFERENCES 设备状态表(设备ID) ON DELETE CASCADE" +
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8";
-
- stmt = conn.createStatement();
- stmt.executeUpdate(logTableSql);
- stmt.close();
-
- print.log("✅ 数据库表结构初始化完成");
- return true;
- } catch (e) {
- print.log("❌ 数据库表结构初始化失败: " + e.message);
- return false;
- }
- }
- /**
- * 注册设备
- */
- function registerDevice(deviceId, deviceName) {
- try {
- var sql = "INSERT INTO 设备状态表 (设备ID, 设备名称, 在线状态, 最后心跳时间) VALUES (?, ?, 1, NOW()) " +
- "ON DUPLICATE KEY UPDATE 设备名称 = VALUES(设备名称), 在线状态 = 1, 最后心跳时间 = NOW()";
-
- var pstmt = conn.prepareStatement(sql);
- pstmt.setString(1, deviceId);
- pstmt.setString(2, deviceName);
- pstmt.executeUpdate();
- pstmt.close();
-
- logOperation(deviceId, "设备注册", "设备 " + deviceName + " 已注册并上线");
- print.log("✅ 设备 " + deviceName + " 注册成功");
- return true;
- } catch (e) {
- print.log("❌ 设备注册失败: " + e.message);
- return false;
- }
- }
- /**
- * 发送心跳包
- */
- function sendHeartbeat(deviceId, cpuUsage, memoryUsage, diskUsage) {
- try {
- var sql = "UPDATE 设备状态表 SET 在线状态 = 1, 最后心跳时间 = NOW(), " +
- "CPU使用率 = ?, 内存使用率 = ?, 磁盘使用率 = ? WHERE 设备ID = ?";
-
- var pstmt = conn.prepareStatement(sql);
- pstmt.setBigDecimal(1, new java.math.BigDecimal(cpuUsage.toFixed(2)));
- pstmt.setBigDecimal(2, new java.math.BigDecimal(memoryUsage.toFixed(2)));
- pstmt.setBigDecimal(3, new java.math.BigDecimal(diskUsage.toFixed(2)));
- pstmt.setString(4, deviceId);
- pstmt.executeUpdate();
- pstmt.close();
-
- logOperation(deviceId, "心跳包", "发送心跳包 - CPU:" + cpuUsage.toFixed(2) + "% 内存:" + memoryUsage.toFixed(2) + "% 磁盘:" + diskUsage.toFixed(2) + "%");
- print.log("✅ 设备 " + deviceId + " 心跳包发送成功");
- return true;
- } catch (e) {
- print.log("❌ 心跳包发送失败: " + e.message);
- return false;
- }
- }
- /**
- * 记录操作日志
- */
- function logOperation(deviceId, operationType, details) {
- try {
- var sql = "INSERT INTO 操作日志表 (设备ID, 操作类型, 操作详情) VALUES (?, ?, ?)";
- var pstmt = conn.prepareStatement(sql);
- pstmt.setString(1, deviceId);
- pstmt.setString(2, operationType);
- pstmt.setString(3, details);
- pstmt.executeUpdate();
- pstmt.close();
- return true;
- } catch (e) {
- // 日志记录失败不影响主流程
- print.log("⚠️ 操作日志记录失败: " + e.message);
- return false;
- }
- }
- /**
- * 检查设备状态
- */
- function checkDeviceStatus() {
- try {
- var sql = "SELECT 设备ID, 设备名称, 在线状态, 最后心跳时间, CPU使用率, 内存使用率, 磁盘使用率 FROM 设备状态表";
- var stmt = conn.createStatement();
- var rs = stmt.executeQuery(sql);
-
- print.log("\n=== 设备状态监控 ===");
- print.log("设备ID\t\t设备名称\t\t在线状态\t最后心跳时间\t\t\tCPU%\t内存%\t磁盘%");
- print.log("------------------------------------------------------------------------------------------------------------");
-
- var offlineDevices = [];
- var highLoadDevices = [];
-
- while (rs.next()) {
- var deviceId = rs.getString("设备ID");
- var deviceName = rs.getString("设备名称");
- var onlineStatus = rs.getInt("在线状态");
- var lastHeartbeat = rs.getTimestamp("最后心跳时间");
- var cpuUsage = rs.getBigDecimal("CPU使用率") || new java.math.BigDecimal("0");
- var memoryUsage = rs.getBigDecimal("内存使用率") || new java.math.BigDecimal("0");
- var diskUsage = rs.getBigDecimal("磁盘使用率") || new java.math.BigDecimal("0");
-
- // 格式化输出
- var nameStr = deviceName + "\t\t";
- if (deviceName.length >= 4) nameStr = deviceName + "\t";
-
- var statusStr = onlineStatus === 1 ? "在线" : "离线";
-
- print.log(deviceId + "\t" + nameStr + statusStr + "\t\t" + lastHeartbeat + "\t" +
- cpuUsage + "\t" + memoryUsage + "\t" + diskUsage);
-
- // 检查离线设备
- if (onlineStatus !== 1) {
- offlineDevices.push({id: deviceId, name: deviceName});
- }
-
- // 检查高负载设备 (CPU或内存使用率超过80%)
- if (cpuUsage.compareTo(new java.math.BigDecimal("80")) > 0 ||
- memoryUsage.compareTo(new java.math.BigDecimal("80")) > 0) {
- highLoadDevices.push({id: deviceId, name: deviceName, cpu: cpuUsage, memory: memoryUsage});
- }
- }
-
- rs.close();
- stmt.close();
-
- // 报告异常设备
- if (offlineDevices.length > 0) {
- print.log("\n⚠️ 发现 " + offlineDevices.length + " 台离线设备:");
- for (var i = 0; i < offlineDevices.length; i++) {
- print.log(" - " + offlineDevices[i].name + " (" + offlineDevices[i].id + ")");
- }
- }
-
- if (highLoadDevices.length > 0) {
- print.log("\n⚠️ 发现 " + highLoadDevices.length + " 台高负载设备:");
- for (var i = 0; i < highLoadDevices.length; i++) {
- var dev = highLoadDevices[i];
- print.log(" - " + dev.name + " (" + dev.id + ") CPU:" + dev.cpu + "% 内存:" + dev.memory + "%");
- }
- }
-
- if (offlineDevices.length === 0 && highLoadDevices.length === 0) {
- print.log("\n✅ 所有设备状态正常");
- }
-
- print.log("");
- return true;
- } catch (e) {
- print.log("❌ 设备状态检查失败: " + e.message);
- return false;
- }
- }
- /**
- * 模拟设备数据生成
- */
- function generateDeviceData() {
- var devices = [
- {id: "DEVICE_001", name: "Web服务器1"},
- {id: "DEVICE_002", name: "数据库服务器"},
- {id: "DEVICE_003", name: "应用服务器1"},
- {id: "DEVICE_004", name: "缓存服务器"},
- {id: "DEVICE_005", name: "负载均衡器"}
- ];
-
- return devices;
- }
- /**
- * 模拟系统资源使用率
- */
- function simulateSystemMetrics() {
- // 模拟CPU使用率 (0-100%)
- var cpu = Math.random() * 100;
-
- // 模拟内存使用率 (0-100%)
- var memory = Math.random() * 100;
-
- // 模拟磁盘使用率 (0-100%,通常较高)
- var disk = 30 + Math.random() * 60;
-
- return {
- cpu: cpu,
- memory: memory,
- disk: disk
- };
- }
- /**
- * 心跳任务执行函数
- */
- function executeHeartbeatTask() {
- print.log("\n⏰ 执行心跳任务 - " + new Date());
-
- try {
- // 检查数据库连接
- if (!conn || conn.isClosed()) {
- print.log("⚠️ 数据库连接已断开,尝试重新连接...");
- if (!connectDatabase()) {
- print.log("❌ 无法重新连接数据库,跳过本次心跳任务");
- return;
- }
- }
-
- // 获取设备列表
- var devices = generateDeviceData();
-
- // 为每个设备发送心跳包
- for (var i = 0; i < devices.length; i++) {
- var device = devices[i];
- var metrics = simulateSystemMetrics();
-
- // 注册设备(如果尚未注册)
- registerDevice(device.id, device.name);
-
- // 发送心跳包
- sendHeartbeat(device.id, metrics.cpu, metrics.memory, metrics.disk);
- }
-
- // 检查设备状态
- checkDeviceStatus();
-
- print.log("✅ 心跳任务执行完成\n");
- } catch (e) {
- print.log("❌ 心跳任务执行失败: " + e.message);
- }
- }
- /**
- * 启动心跳服务
- */
- function startHeartbeatService(intervalSeconds) {
- if (isRunning) {
- print.log("⚠️ 心跳服务已经在运行中");
- return false;
- }
-
- // 连接数据库
- if (!connectDatabase()) {
- print.log("❌ 无法启动心跳服务:数据库连接失败");
- return false;
- }
-
- // 初始化数据库
- if (!initializeDatabase()) {
- print.log("❌ 无法启动心跳服务:数据库初始化失败");
- return false;
- }
-
- isRunning = true;
- print.log("✅ 心跳服务启动成功,间隔: " + intervalSeconds + "秒");
-
- // 立即执行一次
- executeHeartbeatTask();
-
- // 设置定时任务
- heartbeatInterval = setInterval(function() {
- executeHeartbeatTask();
- }, intervalSeconds * 1000);
-
- return true;
- }
- /**
- * 停止心跳服务
- */
- function stopHeartbeatService() {
- if (!isRunning) {
- print.log("⚠️ 心跳服务未在运行");
- return false;
- }
-
- if (heartbeatInterval) {
- clearInterval(heartbeatInterval);
- heartbeatInterval = null;
- }
-
- isRunning = false;
- print.log("✅ 心跳服务已停止");
- return true;
- }
- /**
- * 关闭数据库连接
- */
- function closeConnection() {
- try {
- if (pstmt != null) {
- pstmt.close();
- }
- if (conn != null) {
- conn.close();
- }
- print.log("✅ 数据库连接已关闭");
- } catch (e) {
- print.log("❌ 关闭连接时出错: " + e.message);
- }
- }
- /**
- * 程序退出处理
- */
- function exitHandler() {
- print.log("正在关闭心跳服务...");
- stopHeartbeatService();
- closeConnection();
- print.log("👋 MYQ业务流程心跳程序已退出");
- }
- // 主程序
- try {
- print.log("🚀 启动MYQ业务流程心跳程序");
-
- // 注册退出处理函数
- java.lang.Runtime.getRuntime().addShutdownHook(new java.lang.Thread({
- run: function() {
- exitHandler();
- }
- }));
-
- // 启动心跳服务 (每30秒执行一次)
- if (startHeartbeatService(30)) {
- print.log("✅ MYQ业务流程心跳程序已启动");
- print.log("💡 按 Ctrl+C 停止程序");
-
- // 保持程序运行
- while (isRunning) {
- java.lang.Thread.sleep(1000);
- }
- } else {
- print.log("❌ MYQ业务流程心跳程序启动失败");
- }
-
- } catch (e) {
- print.log("❌ 程序执行过程中发生错误: " + e.message);
- exitHandler();
- }
- print.log("===== MYQ业务流程心跳程序结束 =====");
复制代码
| |  | |  |
|