YYPOST群发软件 发表于 5 天前

数据库MYQ业务流程心跳程序启动

数据库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.name + " (" + offlineDevices.id + ")");
            }
      }
      
      if (highLoadDevices.length > 0) {
            print.log("\n⚠️ 发现 " + highLoadDevices.length + " 台高负载设备:");
            for (var i = 0; i < highLoadDevices.length; i++) {
                var dev = highLoadDevices;
                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;
            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("&#128075; MYQ业务流程心跳程序已退出");
}

// 主程序
try {
    print.log("&#128640; 启动MYQ业务流程心跳程序");
   
    // 注册退出处理函数
    java.lang.Runtime.getRuntime().addShutdownHook(new java.lang.Thread({
      run: function() {
            exitHandler();
      }
    }));
   
    // 启动心跳服务 (每30秒执行一次)
    if (startHeartbeatService(30)) {
      print.log("✅ MYQ业务流程心跳程序已启动");
      print.log("&#128161; 按 Ctrl+C 停止程序");
      
      // 保持程序运行
      while (isRunning) {
            java.lang.Thread.sleep(1000);
      }
    } else {
      print.log("❌ MYQ业务流程心跳程序启动失败");
    }
   
} catch (e) {
    print.log("❌ 程序执行过程中发生错误: " + e.message);
    exitHandler();
}

print.log("===== MYQ业务流程心跳程序结束 =====");


页: [1]
查看完整版本: 数据库MYQ业务流程心跳程序启动