Wiadomość
Wiadomość jest jednym z głównych elementów Watermill. Wiadomości są publikowane przez "wydawców" i odbierane przez "subskrybentów". Podczas przetwarzania wiadomości, jeśli przetwarzanie zawiedzie, należy wysłać Ack()
(sygnalizujące pomyślne przetwarzanie) lub Nack()
(sygnalizujące niepowodzenie przetwarzania).
Ack
i Nack
wiadomości są obsługiwane przez subskrybentów (w domyślnej implementacji, subskrybenci będą czekać na Ack
lub Nack
).
Pełny kod źródłowy: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
type Message struct {
// UUID to unikalny identyfikator wiadomości.
//
// Wykorzystywany do debugowania w Watermill.
// UUID może być puste.
UUID string
// Metadata zawiera metadane wiadomości.
//
// Może być używane do przechowywania danych, które nie muszą być dekodowane z całej ładunku.
// Jest podobne do nagłówków żądania HTTP.
//
// Metadane zostaną zserializowane i zapisane do PubSub.
Metadata Metadata
// Payload to ładunek wiadomości.
Payload Payload
// ack jest zamykany, gdy otrzymano potwierdzenie.
// noAck jest zamykany, gdy otrzymano negatywne potwierdzenie.
ack chan struct{}
noAck chan struct{}
ackMutex sync.Mutex
ackSentType ackType
ctx context.Context
}
// ...
Potwierdzenie (Ack
)
Wysyłanie Ack
Pełny kod źródłowy: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Ack wysyła potwierdzenie dla wiadomości.
//
// Ack nie blokuje.
// Ack jest idempotentne.
// Zwraca false, jeśli już wysłano Nack.
func (m *Message) Ack() bool {
// ...
Negatywne potwierdzenie (Nack
)
Pełny kod źródłowy: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Nack wysyła negatywne potwierdzenie dla wiadomości.
//
// Nack nie blokuje.
// Nack jest idempotentne.
// Zwraca false, jeśli już wysłano Ack.
func (m *Message) Nack() bool {
// ...
Odbieranie Ack/Nack
Pełny kod źródłowy: github.com/ThreeDotsLabs/watermill/docs/content/docs/message/receiving-ack.go
// ...
wybór {
przypadek
Kontekst
Wiadomości zawierają kontekst standardowej biblioteki, tak jak żądanie HTTP.
Pełny kod źródłowy: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Context zwraca kontekst wiadomości. Aby zmienić kontekst, użyj SetContext.
//
// Zwracany kontekst zawsze jest niepusty; domyślnie jest to kontekst tła.
func (m *Message) Context() context.Context {
if m.ctx != nil {
return m.ctx
}
return context.Background()
}
// SetContext ustawia podany kontekst jako kontekst wiadomości.
func (m *Message) SetContext(ctx context.Context) {
m.ctx = ctx
}
// ...