blob: 5a8b2e52729f0c93b5fe7790ca050ace7c25925a [file] [log] [blame]
= 37. Event bus
Date: 2020-05-05
== Status
Accepted (lazy consensus)
== Context
Many features rely on behaviors triggered by interactions with the mailbox API main interfaces (`RightManager`, `MailboxManager`, `MessageManager`, `MessageIdManager`).
We need to provide a convenient extension mechanism for organizing the execution of these behaviours, provide retries and advanced error handling.
Also, protocols enable notifications upon mailbox modifications.
This is for instance the case for `RFC-2177 IMAP IDLE`, leveraged for `RFC-3501 IMAP unsolicitated notifications` when selecting a Mailbox, as well as maintaining the `+IMAP Message Sequence Number <-> Unique IDentifier+` MSN \<-> UID mapping.
Changes happening for a specific entity (mailbox) need to be propagated to the relevant listeners.
== Decision
James mailbox component, a core component of James handling the storage of mails and mailboxes, should use an event driven architecture.
It means every meaningful action on mailboxes or messages triggers an event for any component to react to that event.
`MailboxListener` allows executing actions upon mailbox events.
They could be used for a wide variety of purposes, like enriching mailbox managers features or enabling user notifications upon mailboxes operations performed by other devices via other protocol sessions.
Interactions happen via the managers (`RightManager`, `MailboxManager`, `MessageManager`, `MessageIdManager`) which emit an event on the `EventBus`, which will ensure the relevant ``MailboxListener``s will be executed at least once.
`MailboxListener` can be registered in a work queue fashion on the `EventBus`.
Each work queue corresponds to a given MailboxListener class with the same configuration, identified by their group.
Each event is executed at least once within a James cluster, errors are retried with an exponential back-off delay.
If the execution keeps failing, the event is stored in `DeadLetter` for later reprocessing, triggered via WebAdmin.
Guice products enable the registration of additional mailbox listeners.
A user can furthermore define its own mailboxListeners via the use of `extension-jars`.
MailboxListener can also be registered to be executed only on events concerning a specific entity (eg.
a mailbox).
The `registrationKey` is identifying entities concerned by the event.
Upon event emission, the manager will indicate the `registrationKey` this event should be sent to.
A mailboxListener will thus only receive the event for the registration key it is registered to, in an at least once fashion.
== Consequences
We need to provide an `In VM` implementation of the EventBus for single server deployments.
We also need to provide xref:0038-distributed-eventbus.adoc[a distributed event bus implementation].
== Current usages
The following features are implemented as Group mailbox listeners:
* Email indexing in Lucene or ElasticSearch
* Deletion of mailbox annotations
* Cassandra Message metadata cleanup upon deletion
* Quota updates
* Quota indexing
* Over Quota mailing
* SpamAssassin Spam/Ham reporting