以下是一个简单的 golang RabbitMQ 进程守护脚本示例,使用了 github.com/streadway/amqp 包来连接 RabbitMQ 服务器并启动消费者。
package main
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/streadway/amqp"
)
func main() {
// 连接到 RabbitMQ 服务器
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatalf("Error connecting to RabbitMQ server: %s", err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatalf("Error opening channel: %s", err)
}
defer ch.Close()
q, err := ch.QueueDeclare(
"hello", // 队列名
false, // 是否持久化
false, // 是否自动删除
false, // 是否排他性队列(只能被当前连接访问)
false, // 是否等待消费者确认消息接收(RabbitMQ 3.0+)
nil,
)
if err != nil {
log.Fatalf("Error declaring queue: %s", err)
}
msgs, err := ch.Consume(
q.Name,
"",
true,
false,
false,
false,
nil,
)
if err != nil {
log.Fatalf("Error consuming messages from queue: %s", err)
}
doneChan := make(chan bool)
go func() {
for d := range msgs {
fmt.Printf("Received a message: %s\n", d.Body)
}
}()
fmt.Println("Consumer started. Waiting for messages...")
// 等待信号来停止程序
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
fmt.Println("Stopping consumer...")
doneChan <- true
}
该脚本使用 amqp.Dial 函数连接到 RabbitMQ 服务器,并使用 ch.QueueDeclare 和 ch.Consume 函数声明队列并启动消费者。当收到 SIGINT 或 SIGTERM 信号时,它将退出并关闭消费者。
您可以在此基础上扩展该脚本,例如添加重试逻辑以处理与 RabbitMQ 的连接中断和重新连接等情况。




