Ваше решение довольно разумное: добавьте сообщения во внутреннюю очередь, а затем разрешите фоновую задачу.
Вот несколько полезных советов:
- Если вы не хотите распространяться (в этом случае вам следует взглянуть на JMS), используйте реализацию
BlockingQueue
для своей очереди. В фоновом потоке просто выполните бесконечный цикл, пока take()
-ing-сообщения из очереди. Эти классы позаботятся о потенциальных проблемах параллелизма для вас.
- Используйте
ServletContextListener
для настройки фонового потока при запуске и остановке веб-приложения.
Одна из возможных проблем с использованием необработанного BlockingQueue
заключается в том, что при остановке веб-приложения все сообщения в очереди теряются. Если это серьезная проблема, то, вероятно, будет проще всего использовать базу данных для очереди и использовать notify()
для пробуждения фонового потока, который затем обрабатывает все запросы из базы данных.