110 lines
2.2 KiB
Go
110 lines
2.2 KiB
Go
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
|
|
}
|