【问题标题】:How to publish and consume make(map[string]string) in rabbitmq go lang如何在rabbitmq go lang中发布和消费make(map[string]string)
【发布时间】:2016-07-10 14:17:59
【问题描述】:

我有多个键值类型的对象,我需要将它们发送到 RabbitMQ,因此转发会消耗它们。所以,在浏览完这个RabbitMQ 链接之后。它只告诉发布简单纯文本消息的方式。谁能告诉我如何在 RabbitMQ go lang 中发布和使用地图对象?

     m := make(map[string]string)
     m["col1"] = "004999010640000"
     m["col2"] = "awadwaw"
     m["col3"] = "13"  

     err = ch.Publish(
        "EventCaptureData-Exchange", // exchange
        q.Name + "Key",          // routing key
        true,           // mandatory                            
        false,           // immediate
        amqp.Publishing{
            ContentType: "?????",
            Body:        ????,
        })

【问题讨论】:

  • map[string]string是一个相当简单的数据结构,为什么不用json呢?

标签: go rabbitmq rabbitmqctl


【解决方案1】:

您需要将您的 Go 对象序列化为例如。 base64 文本在发布之前。在你的消费者中,你然后反序列化它以取回你的初始对象。 Go 中的示例参见“Golang serialize and deserialize back”。

对于内容类型,我不确定什么是最合适的。 application/octet-stream?

【讨论】:

  • 由于类型主要是字符串数据 (map[string]string),json 将比 base64 中的 gob 更紧凑。
  • 我同意,JSON 可能是一个更好的选择,原因有很多(更容易调试,可以从另一种语言读取和解释它,等等)。我只是在这里提到了base64,因为我很快就找到了一个例子。我不是 Go 开发人员,因此无法准备基于 JSON 的示例。
【解决方案2】:

就是这么简单。您可以使用jsonbytes 包来序列化和反序列化消息。为你准备了这个例子:

type Message map[string]interface{}

func serialize(msg Message) ([]byte, error) {
    var b bytes.Buffer
    encoder := json.NewEncoder(&b)
    err := encoder.Encode(msg)
    return b.Bytes(), err
}

func deserialize(b []byte) (Message, error) {
    var msg Message
    buf := bytes.NewBuffer(b)
    decoder := json.NewDecoder(buf)
    err := decoder.Decode(&msg)
    return msg, err
}

是的,基本上就是这样。 RabbitMQ 库中的正文字段是字节数组,因此您只需要在数据结构与字节数组之间进行转换即可。

【讨论】:

  • 效果很好。这应该在文档中的某处说明。
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多