| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- package main
- import (
- "Tech/common"
- "Tech/controllers"
- _ "Tech/routers"
- "time"
- "github.com/beego/beego/v2/client/orm"
- "github.com/beego/beego/v2/core/logs"
- "github.com/beego/beego/v2/server/web"
- beego "github.com/beego/beego/v2/server/web"
- "github.com/beego/beego/v2/server/web/filter/cors"
- )
- func init() {
- // 注册驱动(可选的,mysql/sqlite3/postgres 默认已注册):cite[4]
- // orm.RegisterDriver("mysql", orm.DR_MySQL)
- // 从配置文件读取数据库配置
- dbAdapter, _ := beego.AppConfig.String("DB.Adapter")
- dbURL, _ := beego.AppConfig.String("DB.URL")
- // 注册数据库
- orm.RegisterDataBase("default", dbAdapter, dbURL)
- // 启动数据库连接监控协程
- go monitorDatabaseConnection(dbAdapter, dbURL)
- // 注册模型(也可以在主程序入口或模型自身的 init 函数中)
- // orm.RegisterModel(new(User))
- }
- // sendHeartbeatPeriodically 定时发送心跳到信息化服务器
- func sendHeartbeatPeriodically() {
- ticker := time.NewTicker(30 * time.Second) // 每30秒发送一次心跳
- defer ticker.Stop()
- for range ticker.C {
- err := func() error {
- defer func() {
- if r := recover(); r != nil {
- logs.Error("发送心跳时发生异常: %v", r)
- }
- }()
- err := common.SendHeartbeat()
- if err != nil {
- logs.Error("发送心跳失败: %v", err)
- return err
- }
- logs.Info("成功发送心跳到信息化服务器")
- return nil
- }()
- if err != nil {
- logs.Error("发送心跳任务出现错误: %v", err)
- }
- }
- }
- // monitorDatabaseConnection 定时检查数据库连接并尝试重连
- // monitorDatabaseConnection 定时检查数据库连接并尝试重连
- func monitorDatabaseConnection(dbAdapter, dbURL string) {
- ticker := time.NewTicker(10 * time.Second) // 每10秒检查一次
- defer ticker.Stop()
- for range ticker.C {
- // 使用匿名函数包装可能产生异常的操作,并在每次循环都进行异常处理
- func() {
- defer func() {
- if r := recover(); r != nil {
- // 即使NewOrm发生异常,也要尝试重新注册数据库连接
- logs.Error("监控协程发生异常: %v", r)
- err := orm.RegisterDataBase("default", dbAdapter, dbURL)
- if err != nil {
- logs.Error("数据库重连失败: ", err)
- } else {
- logs.Info("数据库重连成功")
- }
- }
- }()
- // 尝试执行一个简单的查询来测试连接
- o := orm.NewOrm()
- _, err := o.Raw("SELECT 1").Exec()
- if err != nil {
- logs.Error("数据库连接异常: ", err)
- // 尝试重新注册数据库连接
- err = orm.RegisterDataBase("default", dbAdapter, dbURL)
- if err != nil {
- logs.Error("数据库重连失败: ", err)
- } else {
- logs.Info("数据库重连成功")
- }
- }
- }()
- }
- }
- func main() {
- // 自动建表。参数说明:数据库别名、是否强制重建(false 则只创建新表)、是否打印日志
- // orm.RunSyncdb("default", false, true)
- // 可选:开启 ORM 调试模式,打印 SQL 日志
- // 将 URL 路径 /static/upload 映射到本地目录 static/upload
- // CORS 过滤器
- beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
- AllowAllOrigins: true,
- AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
- AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Content-Type"},
- ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin"},
- AllowCredentials: true,
- }))
- web.SetStaticPath("/static/upload", "static/upload")
- orm.Debug = true
- // 初始化用户信息缓存
- controllers.InitUserInfoCache()
- // 启动定时发送心跳任务
- go sendHeartbeatPeriodically()
- beego.Run()
- }
|