rabbitmq生产者,并添加断线重连机制 go语言实现
时间: 2023-12-08 14:54:43 浏览: 76
基于Java语言的RabbitMQ生产者和消费者设计源码
以下是使用Go语言实现的RabbitMQ生产者,并添加了断线重连机制的示例代码:
```go
package main
import (
"log"
"os"
"os/signal"
"syscall"
"github.com/streadway/amqp"
)
const (
rabbitURL = "amqp://guest:guest@localhost:5672/"
queueName = "example_queue"
)
func main() {
// 连接RabbitMQ服务器
conn, err := amqp.Dial(rabbitURL)
if err != nil {
log.Fatalf("Failed to connect to RabbitMQ: %v", err)
}
defer conn.Close()
// 创建一个channel
ch, err := conn.Channel()
if err != nil {
log.Fatalf("Failed to open a channel: %v", err)
}
defer ch.Close()
// 声明一个队列
q, err := ch.QueueDeclare(
queueName, // 队列名称
true, // 持久化
false, // 不自动删除
false, // 非独占队列
false, // 不等待消费者
nil, // 额外参数
)
if err != nil {
log.Fatalf("Failed to declare a queue: %v", err)
}
// 声明一个信号量,用于监听操作系统的信号
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// 发送消息到队列
for {
select {
case <-sigs: // 接收到操作系统的信号,退出程序
log.Println("Received interrupt signal, exiting...")
return
default:
// 发送消息到队列
err = ch.Publish(
"", // exchange名称
q.Name, // routing key
false, // 不强制
false, // 不立即
amqp.Publishing{
ContentType: "text/plain",
Body: []byte("Hello, RabbitMQ!"),
},
)
if err != nil {
log.Printf("Failed to publish a message: %v", err)
// 断线重连
conn, err = amqp.Dial(rabbitURL)
if err != nil {
log.Fatalf("Failed to reconnect to RabbitMQ: %v", err)
}
ch, err = conn.Channel()
if err != nil {
log.Fatalf("Failed to open a channel: %v", err)
}
q, err = ch.QueueDeclare(
queueName,
true,
false,
false,
false,
nil,
)
if err != nil {
log.Fatalf("Failed to declare a queue: %v", err)
}
} else {
log.Printf("Message sent to queue: %s", q.Name)
}
}
}
}
```
在上述代码中,我们使用了一个无限循环来不断地发送消息到队列中,并在发送失败时进行断线重连。同时,我们还使用了一个信号量来监听操作系统的信号,以便在接收到信号时退出程序。
阅读全文