Spring events that survive a crash
A fire-and-forget @Async listener turns every SMTP hiccup into a lost message. Here is how @TransactionalEventListener plus an event publication table makes it durable — and the four ways that setup silently does nothing.