go - 从 amqp 解码消息正文时出错

标签 go rabbitmq amqp unmarshalling

我正在尝试使用 AMQP 在消息正文中发送 JSON 并接收它。消息发送没有任何错误,但是我无法在另一端解码它。我得到一个 unexpected end of JSON input错误。
JSON:

var jsonStr = []byte(`
{
    "name": "Test",
    "phone_number": "12345"
}`)
err = files.SendMessageToCore(jsonStr, "event.saveorder")
if err != nil {
    logr.Error("Error sending a message to rabbitmq:", fmt.Sprintf("%v", err))
}
SendMessageToCore 函数:
func SendMessageToCore(body []byte, routingKey string) error {
pb, err := GetRabbitPublisher()
if err != nil {
    return err
}

var message amqp.Message
message.Exchange = "example"
message.RoutingKey = routingKey
message.Body = body
messageByte, err := json.Marshal(message)
if err != nil {
    return err
}
err = (*pb).Publish(amqp.Message{Exchange: message.Exchange, RoutingKey: message.RoutingKey, Body: messageByte})
if err != nil {
    return err
}
fmt.Println("Message was successfully sent")
return nil
}
解码部分:
func SaveOrderEventHandler(mes amqp.Message) *amqp.Message {
var incomingMessage amqp.Message
if err := json.Unmarshal(mes.Body, &incomingMessage); err != nil {
    fmt.Println(err)
    return nil
}

var user foodDomain.User
if err := json.Unmarshal(incomingMessage.Body, &user); err != nil {
    fmt.Println("Error unmarshalling incomingMessage body: ", err) //Error appears here
    return nil
}
fmt.Println(user.PhoneNumber)

return nil
}
用户结构:
type User struct {
   Name        string `json:"name"`
   PhoneNumber string `json:"phone_number"`
}

最佳答案

在您的 SendMessageToCore你已经初始化了amqb.Message .无需在 Publish 中重新初始化func,只需传递您初始化的message .另外,您的 json字符串 body已经在 jsonByte ,所以不需要marshal再一次。
例如 -

func SendMessageToCore(body []byte, routingKey string) error {
    pb, err := GetRabbitPublisher()
    if err != nil {
        return err
    }

    var message amqp.Message
    message.Exchange = "example"
    message.RoutingKey = routingKey
    message.Body = body
    err = (*pb).Publish(message)
    if err != nil {
        return err
    }
    fmt.Println("Message was successfully sent")
    return nil
}
还有你的mes已经在 amqp.Message类型,因此无需解码 mes.Body进入 amqp.Message类型变量。
直接unmarshal您的 mes.Body进入 user .
func SaveOrderEventHandler(mes amqp.Message) *amqp.Message {
    var user foodDomain.User
    if err := json.Unmarshal(mes.Body, &user); err != nil {
        fmt.Println(err)
        return nil
    }

    fmt.Println(user.PhoneNumber)

    return nil
}

关于go - 从 amqp 解码消息正文时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64021689/

相关文章:

spring - RabbitMQ + Spring 云流 : usage of groups

java - 如何使用 RabbitMQ 和 nodejs 运行独立的 java

go - 将protobuf消息转换为struct后添加了一些奇怪的字段?

在 Go 中压缩一个字节数组

GT.M 数据库的 golang 包

.net - 在NServiceBus中为RabbitMQ交换MSMQ

go - %g 中具有宽度和精度字段的 fmt.Printf 行为异常

javascript - 用于 C++ 应用程序集成的 RabbitMQ 与 NodeJS 插件

javascript - 如何使用 amqplib 库中的 channel.assertQueue 函数用于 node.JS?

rabbitmq - 使用 Ruby-Amqp 时如何保持 AMQP 连接打开?