package message import ( "context" "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" amqp "github.com/rabbitmq/amqp091-go" "sync" "time" ) var ( conn *amqp.Connection channel *amqp.Channel rabbitmqMu sync.RWMutex ) // config RabbitMQ 配置 type config struct { Host string Port int Username string Password string VHost string } func rabbitmqConnect(ctx context.Context) error { rabbitmqMu.Lock() defer rabbitmqMu.Unlock() LOOP: cfg := &config{ Host: g.Cfg().MustGet(ctx, "rabbitmq.host").String(), Port: g.Cfg().MustGet(ctx, "rabbitmq.port").Int(), Username: g.Cfg().MustGet(ctx, "rabbitmq.username").String(), Password: g.Cfg().MustGet(ctx, "rabbitmq.password").String(), VHost: g.Cfg().MustGet(ctx, "rabbitmq.vhost", "/").String(), } url := "amqp://" + cfg.Username + ":" + cfg.Password + "@" + cfg.Host + ":" + gconv.String(cfg.Port) + "/" + cfg.VHost var err error conn, err = amqp.Dial(url) if err != nil { g.Log().Errorf(ctx, "重连失败: %v", err) time.Sleep(2 * time.Second) goto LOOP } channel, err = conn.Channel() if err != nil { g.Log().Errorf(ctx, "创建 Channel 失败: %v", err) time.Sleep(2 * time.Second) goto LOOP } g.Log().Info(ctx, "RabbitMQ 重连成功") return nil } // rabbitmqReconnect 重新连接 func rabbitmqReconnect(ctx context.Context) error { if err := rabbitmqConnect(ctx); err != nil { return fmt.Errorf("nats重连失败: %w", err) } return nil } // rabbitmqPing 检测 RabbitMQ 连接状态 func rabbitmqPing() bool { rabbitmqMu.RLock() defer rabbitmqMu.RUnlock() if conn == nil || conn.IsClosed() { return false } return true } // rabbitmqClose 关闭连接 func rabbitmqClose(ctx context.Context) error { rabbitmqMu.Lock() defer rabbitmqMu.Unlock() var lastErr error if channel != nil { if err := channel.Close(); err != nil { g.Log().Errorf(ctx, "关闭 RabbitMQ Channel 失败: %v", err) lastErr = err } channel = nil } if conn != nil { if err := conn.Close(); err != nil { g.Log().Errorf(ctx, "关闭 RabbitMQ 连接失败: %v", err) lastErr = err } conn = nil } g.Log().Info(ctx, "RabbitMQ 连接已关闭") return lastErr }