如何在RabbitMQ上阅读现有消息

时间:2019-07-15 11:09:17

标签: go rabbitmq

我创建了以下方法,这些方法连接到RabbitMQ,并在每次出现消息时使用通道通知工作人员。

它工作正常,但仅适用于工作进程运行时到达的消息。我无法从队列中获取预先存在的消息,它们永远存在,或者直到RabbitMQ销毁它们为止。

package externalservices

import (
    "../domain"
    "encoding/json"
    "github.com/streadway/amqp"
    "os"
)

const (
    catalogQueue = "catalog-queue"
)

// DequeueMessageCatalog is nice
func DequeueMessageCatalog(messageChannel chan domain.Catalog) {

    message := make(chan []byte)
    defer close(message)

    for true {
        go func() {
            dequeue(catalogQueue, message)
        }()

        currCatalog := domain.Catalog{}
        json.Unmarshal([]byte(<-message), &currCatalog)
        messageChannel <- currCatalog
    }
}

func openConnection() (*amqp.Connection, *amqp.Channel, error) {
    connString := os.Getenv("RabbitMQConStr")
    conn, err := amqp.Dial(connString)
    if err != nil {
        return nil, nil, err
    }

    ch, err := conn.Channel()
    if err != nil {
        conn.Close()
        return nil, nil, err
    }
    return conn, ch, nil
}

func ensureQueueExists(queueName string, ch *amqp.Channel) (amqp.Queue, error) {
    q, err := ch.QueueDeclare(
        queueName, // name
        false,     // durable
        false,     // delete when unused
        false,     // exclusive
        false,     // no-wait
        nil,       // arguments
    )

    return q, err
}

func dequeue(queueName string, message chan []byte) error {
    con, ch, err := openConnection()
    if err != nil {
        return err
    }

    defer con.Close()
    defer ch.Close()

    q, err := ensureQueueExists(queueName, ch)
    if err != nil {
        return err
    }
    msgs, err := ch.Consume(
        q.Name, // queue
        "",     // consumer
        true,   // auto-ack
        false,  // exclusive
        false,  // no-local
        true,  // no-wait
        nil,    // args
    )
    if err != nil {
        return err
    }
    for currMsg := range msgs {
        message <- currMsg.Body
    }
    return nil
}

是否需要设置其他方法或属性,以便在工作人员开始运行之前也可以排队接收消息?

0 个答案:

没有答案