А в чём у вас проблема с запуском тестов? Просто запускаете в тестовом окружении внедряемый контейнер, который точно так же, как настоящий Wildfly, отдаст приложению источник данных по JNDI или внедрит его.
rail01y, видимо, запросы шлёте неправильно. Если открыть два браузера и отправить запрос к localhost:8888 одновременно, то оба запроса будут приняты и спустя 10 секунд вернут ответ, как и полагается. Если бы была блокировка, то сначала один бы ответил через 10 секунд, потом второй был бы принят и ответил бы ещё через 10 секунд.
На написание этого функционала на бэкенде со Spring'ом нужно максимум 5 минут и около 50 строк кода. На фронте нужно просто подключить что-нибудь вроде TinyMCE или CKEditor.
ericcartman, Netty это фреймворк для разработки асинхронных серверов. Перед сервером на Netty ставить ничего не требуется. И над ним что-то ставить тоже не надо. Если хочется асинхронности, но попроще, то можно взять Spring WebFlux. Правда, я не знаю, способен ли он решать C10k problem.
Грубо говоря, если 100 человек подключатся к приложению на Spring MVC, будет запущено 100 потоков, каждый из которых будет обслуживать своё соединение. Если 100 человек подключатся к приложению на Netty, поток останется один, в нём будет крутиться бесконечный цикл, проверяющий на каждой итерации наличие данных в каждом из 100 соединении и вызывающий обработчик, в случае необходимости.
ericcartman, CompletableFuture.supplyAsync() выполнит лямбда-выражение не асинхронно, а параллельно, в отдельном потоке.
Я советую вам написать с нуля свой http-сервер. Сначала однопоточный на сокетах. Потом сделать его многопоточным. Потом переписать в асинхронном варианте с java.nio.channels. Потом переписать ещё раз на Netty. Потом вдумчиво изучить Servlet API. Это даст вам базу, чтобы понимать как там все происходит.