Description
The following can happen when there are more mails to send than the max queue size.
2022-12-15 13:33:47,578 [Mail Prepare Thread] ERROR o.x.m.i.DatabaseMailListener   - Failure during preparation phase of thread [226f9aff-7fd4-409e-8fbd-0455ff1894fe]
java.lang.IllegalStateException: Queue full
        at java.util.AbstractQueue.add(AbstractQueue.java:98)
        at org.xwiki.mail.internal.thread.AbstractMailQueueManager.addToQueue(AbstractMailQueueManager.java:53)
        at org.xwiki.mail.internal.thread.PrepareMailRunnable.prepareSingleMail(PrepareMailRunnable.java:190)
        at org.xwiki.mail.internal.thread.PrepareMailRunnable.prepareMail(PrepareMailRunnable.java:123)
        at org.xwiki.mail.internal.thread.PrepareMailRunnable.run(PrepareMailRunnable.java:78)
        at java.lang.Thread.run(Thread.java:748)
Note that this behavior was not intended as the javadoc says:
 /**
     * @return the max size of the send queue. When this size is reached calls to put new elements on the queue will
     *         block
     * @since 11.6RC1
     */
    default int getSendQueueCapacity()
    {
        return 1000;
    }
The reason is probably the usage of "add" at https://github.com/xwiki/xwiki-platform/blob/dbdb22e5815ce56331279cb2fcce2bf10665cdd2/xwiki-platform-core/xwiki-platform-mail/xwiki-platform-mail-send/xwiki-platform-mail-send-default/src/main/java/org/xwiki/mail/internal/thread/AbstractMailQueueManager.java#L53
Note that XWIKI-16309 introduced a new API:
    /**
     * Add a mail on the queue for processing, waiting a max of timeout.
     *
     * @param mailQueueItem the object representing the mail item to add to the queue
     * @param timeout how long to wait before giving up, in units of {@code unit}
     * @param unit a {@code TimeUnit} determining how to interpret the {@code timeout} parameter
     * @throws InterruptedException if it times out i.e if the queue doesn't have any empty slot freed in the specified
     *         timeout time
     * @since 11.6RC1
     */
    default void addMessage(T mailQueueItem, long timeout, TimeUnit unit) throws InterruptedException
But it's not used yet and "addtoQueue" is still used at https://github.com/xwiki/xwiki-platform/blob/9517ab02a48cbb6d07f535fdc43e84525c77c23b/xwiki-platform-core/xwiki-platform-mail/xwiki-platform-mail-send/xwiki-platform-mail-send-default/src/main/java/org/xwiki/mail/internal/thread/PrepareMailRunnable.java#L190
Attachments
Issue Links
- is caused by
- 
                    XWIKI-16309 PrepareMailQueueManager use an infinite queue -         
- Closed
 
-         
- relates to
- 
                    XWIKI-20520 Mail messages can be dropped without errors in the UI if the prepare thread is full -         
- Closed
 
-