الرسالة

الرسالة هي واحدة من الأجزاء الأساسية لـ 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 سيتم تجميعها وحفظها في 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 متعدد الإدخال.
// يُعيد القيمة false إذا تم بالفعل إرسال Nack.
func (m *Message) Ack() bool {
// ...

Nack

الشفرة الكاملة: github.com/ThreeDotsLabs/watermill/message/message.go

// ...
// يُرسل Nack تأكيدًا سلبيًا للرسالة.
//
// Nack لا يحظر.
// يعتبر Nack متعدد الإدخال.
// يُعيد القيمة false إذا تم بالفعل إرسال Ack.
func (m *Message) Nack() bool {
// ...

استقبال Ack/Nack

الشفرة الكاملة: github.com/ThreeDotsLabs/watermill/docs/content/docs/message/receiving-ack.go

// ...
select {
case 

السياق

تحتوي الرسائل على السياق القياسي من المكتبة القياسية، تمامًا مثل طلب HTTP.

الشفرة الكاملة: github.com/ThreeDotsLabs/watermill/message/message.go

// ...
// يُعيد Context السياق للرسالة. لتغيير السياق يُرجى استخدام SetContext.
//
// السياق المُعاد دائمًا غير فارغ؛ الافتراضي هو سياق الخلفية.
func (m *Message) Context() context.Context {
	if m.ctx != nil {
		return m.ctx
	}
	return context.Background()
}

// SetContext يضبط السياق المُقدم كسياق للرسالة.
func (m *Message) SetContext(ctx context.Context) {
	m.ctx = ctx
}
// ...