Mensaje
El mensaje es una de las partes fundamentales de Watermill. Los mensajes son publicados por "editores" y recibidos por "suscriptores". Al procesar los mensajes, si el procesamiento falla, se debe enviar un Ack()
(indicando un procesamiento exitoso) o un Nack()
(indicando un fallo en el procesamiento).
El Ack
y Nack
del mensaje son manejados por suscriptores (en la implementación por defecto, los suscriptores esperarán un Ack
o un Nack
).
Código fuente completo: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
type Message struct {
// UUID es el identificador único del mensaje.
//
// Se utiliza para depurar en Watermill.
// UUID puede estar vacío.
UUID string
// Metadata contiene los metadatos del mensaje.
//
// Puede usarse para almacenar datos que no necesitan ser decodificados de todo el payload.
// Es similar a los encabezados de solicitud HTTP.
//
// Los metadatos se codificarán y se guardarán en PubSub.
Metadata Metadata
// Payload es el contenido del mensaje.
Payload Payload
// ack se cierra cuando se recibe una confirmación.
// noAck se cierra cuando se recibe una negación.
ack chan struct{}
noAck chan struct{}
ackMutex sync.Mutex
ackSentType ackType
ctx context.Context
}
// ...
Ack
Enviando Ack
Código fuente completo: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Ack envía una confirmación para el mensaje.
//
// Ack no bloquea.
// Ack es idempotente.
// Devuelve false si Nack ya ha sido enviado.
func (m *Message) Ack() bool {
// ...
Nack
Código fuente completo: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Nack envía una negación para el mensaje.
//
// Nack no bloquea.
// Nack es idempotente.
// Devuelve false si Ack ya ha sido enviado.
func (m *Message) Nack() bool {
// ...
Recibiendo Ack/Nack
Código fuente completo: github.com/ThreeDotsLabs/watermill/docs/content/docs/message/receiving-ack.go
// ...
select {
case
Contexto
Los mensajes contienen el contexto de la biblioteca estándar, al igual que una solicitud HTTP.
Código fuente completo: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Context devuelve el contexto del mensaje. Para cambiar el contexto, utilice SetContext.
//
// El contexto devuelto siempre es distinto de nulo; el predeterminado es el contexto de fondo.
func (m *Message) Context() context.Context {
if m.ctx != nil {
return m.ctx
}
return context.Background()
}
// SetContext establece el contexto proporcionado como el contexto del mensaje.
func (m *Message) SetContext(ctx context.Context) {
m.ctx = ctx
}
// ...