Message
Message(消息)是 Watermill 的核心部分之一。消息由发布者发出,由订阅者接收。当消息被处理时,您应该在处理失败时发送 Ack()
或 Nack()
。
Ack
和 Nack
由订阅者处理(在默认实现中,订阅者等待 Ack
或 Nack
)。
完整源码:
- github.com/ThreeDotsLabs/watermill/message/message.go
// ... type Message struct { // UUID 是消息的唯一标识符。 // // 它仅由 Watermill 用于调试。 // UUID 可以为空。 UUID string // Metadata 包含消息元数据。 // // 可以用于存储不需要对整个有效负载 unmarshaling 的数据。 // 它类似于 HTTP 请求的头。 // // Metadata 将被 marshal,并将保存到 PubSub。 Metadata Metadata // Payload 是消息的有效负载。 Payload Payload // 当收到确认时,ack 关闭。 ack chan struct{} // noACk is closed, when negative acknowledge is received. // 当收到否定应答时,noACk 关闭。 noAck chan struct{} ackMutex sync.Mutex ackSentType ackType ctx context.Context } // ...
Ack
发送 Ack
完整源码:
- github.com/ThreeDotsLabs/watermill/message/message.go
// ... // Ack 发送消息的确认。 // // Ack 是非阻塞的。 // Ack 是等幂的。 // 如果 Nack 已经发送,则返回 False。 func (m *Message) Ack() bool { // ...
Nack
完整源码:
- github.com/ThreeDotsLabs/watermill/message/message.go
// ... // Nack 发送消息的否定确认。 // // Nack 是非阻塞的。 // Nack 是等幂的。 // 如果 Ack 已经发送,则返回 False。 func (m *Message) Nack() bool { // ...
接收 Ack/Nack
完整源码:
- github.com/ThreeDotsLabs/watermill/docs/content/docs/message/receiving-ack.go
// ... select { case <-msg.Acked(): log.Print("ack received") case <-msg.Nacked(): log.Print("nack received") } // ...
Context
Message 包含标准库上下文,就像 HTTP 请求一样。
完整源码:
- github.com/ThreeDotsLabs/watermill/message/message.go
// ... // Context 返回消息的上下文。要更改上下文,使用 SetContext。 // // 返回的上下文总是非空的;它默认为 background context.。 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 } // ...