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)
广告
将在 10 秒后关闭
bannerAds