ข้อความ

ข้อความเป็นหนึ่งในส่วนหลักของ Watermill ข้อความจะถูกเผยแพร่โดย "ผู้เผยแพร่" และถูกรับโดย "ผู้สมัคร". เมื่อประมวลผลข้อความ หากการประมวลผลล้มเหลว คุณควรส่ง Ack() (แสดงถึงการประมวลผลเรียบร้อย) หรือ Nack() (แสดงถึงความล้มเหลวในการประมวลผล)

การดำเนินการ Ack และ Nack ของข้อความถูกจัดการโดยผู้รับ (ในการดำเนินการเริ่มต้น ผู้สมัครจะรอ Ack หรือ Nack)

ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/message/message.go

// ...
type Message struct {
	// UUID เป็นตัวระบุที่ไม่ซ้ำกันของข้อความ
	//
	// ใช้สำหรับการดีบักจากด้านของ Watermill
	// UUID อาจว่างเปล่า
	UUID string

	// Metadata ประกอบด้วยเมตาดาต้าของข้อความ
	//
	// สามารถใช้เพื่อเก็บข้อมูลที่ไม่จำเป็นต้องถอดรหัสจากข้อความทั้งหมด
	// คล้ายกับส่วนหัวของคำขอ HTTP
	//
	// Metadata จะถูก marshaled และบันทึกไว้ที่ PubSub
	Metadata Metadata

	// Payload เป็นส่วนของข้อความ
	Payload Payload

	// ack จะถูกปิดเมื่อได้รับคำขอตอบรับ
	// noAck จะถูกปิดเมื่อได้รับคำขอตอบรับที่เป็นลบ
	ack chan struct{}
	noAck chan struct{}

	ackMutex sync.Mutex
	ackSentType ackType

	ctx context.Context
}

// ...

Ack

การส่ง Ack

ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/message/message.go

// ...
// Ack ส่งคำขอตอบรับสำหรับข้อความ
//
// Ack ไม่บล็อค
// Ack เป็น idempotent
// คืนค่าเป็นเท็จหาก Nack ถูกส่งไปแล้ว
func (m *Message) Ack() bool {
// ...

Nack

ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/message/message.go

// ...
// Nack ส่งคำขอตอบรับที่เป็นลบสำหรับข้อความ
//
// Nack ไม่บล็อค
// Nack เป็น idempotent
// คืนค่าเป็นเท็จหาก Ack ถูกส่งไปแล้ว
func (m *Message) Nack() bool {
// ...

การรับ Ack/Nack

ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/docs/content/docs/message/receiving-ack.go

// ...
เลือก {
กรณี 

Context

ข้อความมี context ของมาตรฐานของไลบรารีเท่ากับคำขอ HTTP

ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/message/message.go

// ...
// Context คืนค่า context ของข้อความ หากต้องการเปลี่ยน context ให้ใช้ SetContext
//
// Context ที่คืนมาคือเสมอไม่เป็นค่าว่าง ค่าเริ่มต้นคือ context พื้นหลัง
func (m *Message) Context() context.Context {
	if m.ctx != nil {
		return m.ctx
	}
	return context.Background()
}

// SetContext ตั้งค่า context ที่ให้มาเป็น context ของข้อความ
func (m *Message) SetContext(ctx context.Context) {
	m.ctx = ctx
}
// ...