Сообщение
Сообщение - одна из основных частей Watermill. Сообщения публикуются "издателями" и принимаются "подписчиками". При обработке сообщений, если обработка завершается неудачно, вы должны отправить Ack()
(означает успешную обработку) или Nack()
(означает неудачную обработку).
Ack
и Nack
сообщения обрабатываются подписчиками (в реализации по умолчанию подписчики будут ожидать Ack
или Nack
).
Полный исходный код: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
type Message struct {
// UUID - уникальный идентификатор сообщения.
//
// Используется для отладки в Watermill.
// UUID может быть пустым.
UUID string
// Metadata содержит метаданные сообщения.
//
// Может использоваться для хранения данных, которые не нужно декодировать из всей нагрузки.
// Аналогично заголовкам запросов HTTP.
//
// Метаданные будут упакованы и сохранены в 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
// ...
выбор {
случай
Контекст
Сообщения содержат контекст стандартной библиотеки, такой же, как у 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
}
// ...