我有一個go向其發布訊息的服務,rabbitmq負責該部分的代碼如下:
package main
import (
"log"
"github.com/streadway/amqp"
)
func main() {
conn, amqError := amqp.Dial("amqp://localhost:5672/")
if amqError != nil {
panic(amqError)
}
ch, err := conn.Channel()
failOnError(err, "Failed to open a channel")
q, err := ch.QueueDeclare(
"default", // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
failOnError(err, "Failed to declare a queue")
body := "{ \"body\":\"Hello...\", \"pattern\":\"test\", \"age\":\"20\"}"
err = ch.Publish(
"", // exchange
q.Name, // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
},
)
failOnError(err, "Failed to publish a message")
}
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
Nestjs消耗訊息的部分是:
import { Controller } from '@nestjs/common';
import { Ctx, EventPattern, Payload, RmqContext } from '@nestjs/microservices';
@Controller()
export class AppController {
constructor() { }
@EventPattern("test")
getEventMessage(@Payload() data: any, @Ctx() context: RmqContext) {
console.log("data is -> ", data) // always undefined
console.log(
"content of message is -> ",
JSON.parse(
context.getMessage().content.toString() // from buffer to string
)
)
}
}
現在的問題是我無法從 data 中獲取訊息而不是從 決議它ctx,我還需要在 go 中發送訊息,json而不像這樣跳過雙引號"\""
uj5u.com熱心網友回復:
以下是對您提出的問題的答復:
- 在 NextJS 的示例中,他們沒有提供如何使用有效載荷資料,而是說:
要訪問原始 RabbitMQ 訊息(帶有屬性、欄位和內容),請使用 RmqContext 的 getMessage() 方法
鑒于上述陳述句,您正在正確決議佇列中的訊息。
- 避免手動發送正文字串,您應該使用一個名為 json Marhsal of struct 的程序,例如:
- 您應該創建一個包含要發送到佇列的資訊的結構
- 元帥結構并生成
[]byte
type MessageQueue struct {
Body string `json:"body"`
Pattern string `json:"pattern"`
Age string `json:"age"`
Data string `json:"data"`
}
func NewMessageQueue(body, pattern, age string, data) *MessageQueue {
return &MessageQueue{
body, pattern, age, data
}
}
func (m *MessageQueue) Marshal() ([]byte, error) {
bytes, err := json.Marshal(m)
if err != nil {
return nil, err
}
return bytes, err
}
func main() {
...
message := NewMessageQueue("Hello...", "test", "20", "data...")
// TODO: check the error
body, _ := message.Marshal()
err = ch.Publish(
"", // exchange
q.Name, // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "text/plain",
Body: body,
},
)
...
}
更新:
data控制器在getEventMessage方法上接收到的引數,它應該從 Golang 的 body 上發送,以便由Nestjs. 這意味著結構應該如下:
type MessageQueue struct {
Body string `json:"body"`
Pattern string `json:"pattern"`
Age string `json:"age"`
Data string `json:"data"`
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400788.html
