Сообщение

Сообщение - одна из основных частей 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
}
// ...