init
This commit is contained in:
115
internal/rabbitmq/client.go
Normal file
115
internal/rabbitmq/client.go
Normal file
@@ -0,0 +1,115 @@
|
||||
package rabbitmq
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/rabbitmq/amqp091-go"
|
||||
)
|
||||
|
||||
// Client 封装 RabbitMQ 连接和操作
|
||||
type Client struct {
|
||||
conn *amqp091.Connection // 连接
|
||||
channel *amqp091.Channel // 通道
|
||||
ExchangeName string // 交换机名称
|
||||
}
|
||||
|
||||
// Publish 向交换机发布消息
|
||||
func (c *Client) Publish(exchange, routingKey string, body []byte) error {
|
||||
return c.channel.Publish(
|
||||
exchange,
|
||||
routingKey,
|
||||
false, // mandatory
|
||||
false, // immediate
|
||||
amqp091.Publishing{
|
||||
ContentType: "application/json",
|
||||
Body: body,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
// NewClient 创建 RabbitMQ 客户端
|
||||
func NewClient(uri string) (*Client, error) {
|
||||
conn, err := amqp091.Dial(uri)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 交换机名称
|
||||
exchangeName := "chat.exchange"
|
||||
ch, err := conn.Channel()
|
||||
if err != nil {
|
||||
conn.Close()
|
||||
return nil, err
|
||||
}
|
||||
// 声明交换机
|
||||
err = ch.ExchangeDeclare(
|
||||
exchangeName,
|
||||
"topic",
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
nil,
|
||||
)
|
||||
if err != nil {
|
||||
fmt.Println("ExchangeDeclare error:", err)
|
||||
conn.Close()
|
||||
return nil, err
|
||||
}
|
||||
return &Client{
|
||||
conn: conn,
|
||||
channel: ch,
|
||||
ExchangeName: exchangeName, // 记录名称
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Close 关闭连接
|
||||
func (c *Client) Close() {
|
||||
c.channel.Close()
|
||||
c.conn.Close()
|
||||
}
|
||||
|
||||
// DeclareQueue 创建唯一队列(自动删除)
|
||||
func (c *Client) DeclareQueue() (string, error) {
|
||||
// 队列名格式: chat.queue.{timestamp}.{random}
|
||||
queue, err := c.channel.QueueDeclare(
|
||||
"", // 队列名 空 → 自动生成唯一名称
|
||||
false, // 持久化
|
||||
true, // 自动删除
|
||||
true, // 独占
|
||||
false, // 是否等待确认
|
||||
nil, // 参数
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Sprintf("error: %v", err), err
|
||||
}
|
||||
return queue.Name, nil
|
||||
}
|
||||
|
||||
// BindQueue 绑定队列到交换机
|
||||
func (c *Client) BindQueue(queueName, routingKey string) error {
|
||||
err := c.channel.QueueBind(
|
||||
queueName,
|
||||
routingKey,
|
||||
c.ExchangeName,
|
||||
false,
|
||||
nil,
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ConsumeMessages 消费消息
|
||||
func (c *Client) Consume(queueName string) (<-chan amqp091.Delivery, error) {
|
||||
return c.channel.Consume(
|
||||
queueName, // Queue
|
||||
"", // Consumer tag (自动生成)
|
||||
false, // Auto-ack: 手动 ACK(关键!)
|
||||
false, // 独占
|
||||
false, // 不本地
|
||||
false, // 不等待
|
||||
nil, // 参数
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user