Go语言和RabbitMQ
在此次使用Go实现API时,我们将获取事件。这些事件是由RabbitMQ提供的。
这次我们决定使用”github.com/streadway/amqp”包。
事件监视处理如下所示。
func main() {
// RabbitMQ
app := makeApp()
app.Run(os.Args)
}
func makeApp() *cli.App {
app := cli.NewApp()
app.Name = "おすきな名前を"
app.Usage = "RubbitMQからのメッセージ取得"
app.Version = "1.0"
app.Compiled = time.Now()
app.Commands = []cli.Command{
{
Name: "rabbitmq", //(A)
Usage: "cacheClear対象のistyle_idの取得",
Action: catchEventMessages,
},
}
return app
}
func catchEventMessages(c *cli.Context) {
conn, err := amqp.Dial("amqp://hoges:hoge@dev-hoge.com/") //(B)
if err != nil {
fmt.Println(err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
fmt.Println(err)
}
defer ch.Close()
q, err := ch.QueueDeclare(
"rabbitmq_use_consumer_name", // name (C)
true, // durable (D)
false, // delete when usused
false, // exclusive
false, // noWait
nil, // arguments
)
if err != nil {
fmt.Println(err)
}
msgs, err := ch.Consume(
q.Name, // queue
"", // consumer
false, // auto-ack (E)
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
if err != nil {
fmt.Println(err)
}
fmt.Println(msgs)
}
在启动命令时,重点是需要在main.go之后加上名称来启动,所以需要写下这个名称。
$ go run main.go rabbitmq
(B)的URL是MQ的URL。
(C)是消费者的名称。
(D)(E)是用来防止在RabbitMQ因某种故障重新启动时丢失消息的设置。(E)将auto-ack设置为false,可以使MQ端的消息保留,不会消失。
当处理完毕后,需要删除MQ端的消息,请使用下述方式进行确认。
d.Ack(false)