Я пишу приложение для обработки сообщений (электронной почты), для которого хочу иметь исходящую очередь. Я разработал это таким образом, чтобы иметь одноэлементный класс очереди, ThreadedQueueSender, поддерживаемый службой Executor и BlockingQueue. Кроме того, пул потоков объектов javax.mail.Transport используется для получения и освобождения соединений с исходящим SMTP-сервером.
Этот класс предоставляет метод add(MimeMessage)
, который добавляет сообщения в рабочую очередь (BlockingQueue
).
При создании экземпляра класса ExecutorService
инициализируется ThreadPoolExecutor
с фиксированным количеством потоков, скажем, 5. Метод run()
каждого потока находится в бесконечном цикле, который завершается только при обнаружении прерывания (когда вызывается ExecutorService.shutdownNow()
).
Этот метод запуска использует BlockingQueue.poll()
для получения сообщений из рабочей очереди до тех пор, пока больше не будет доступно без блокировки, затем запрашивает объект Transport
из пула соединений, открывает соединение, отправляет все полученные сообщения, закрывает соединение и возвращает объект Transport
.
Это работает, но я чувствую, что не использую все преимущества ExecutorService, имея фиксированное количество потоков, которые выполняются в течение всего срока службы приложения. Кроме того, я сам управляю рабочей очередью, а не позволяю фреймворкам параллелизма обрабатывать ее. Как другие реализовали бы эту функциональность? Лучше ли обернуть каждое входящее сообщение в Runnable, а затем выполнить логику отправки?
Спасибо, любые комментарии приветствуются.
Райан