Мне кажется, вы не совсем поняли, как работают сервлеты asyn c. Идея состоит в том, что вы освобождаете веб-поток (обычно в пуле потоков http, размер которого можно настроить на сервере приложений), а затем завершаете sh работу запроса в каком-то другом потоке. В конце вы должны вызвать AsyncContext.complete()
, чтобы на самом деле завершить sh запрос и вернуть ответ клиенту (который все еще ждет).
Обратите внимание, что весь поток не будет быстрее ( на самом деле это будет немного медленнее, чем при нормальной синхронной обработке. Преимущество этого заключается в том, что вы можете освободить поток HTTP раньше, чтобы он мог обрабатывать другие запросы HTTP. Обычно поток HTTP блокируется на все время работы вашего метода doGet / Post, и если вы выполняете там обширную обработку и / или ввод-вывод, это может заполнить пул потоков HTTP, и когда это произойдет, ваше приложение будет не сможет больше обрабатывать HTTP-запросы. (Или, точнее, клиентское соединение будет зависать до тех пор, пока один из потоков HTTP не станет снова доступен для обработки запроса.)
Однако в вашем коде я не вижу, куда вы звоните AsyncContext.complete()
или заканчивая doGet()
logi c, вроде вернуть какие-то данные клиенту. Могут быть и другие проблемы, но это наиболее очевидная причина, по которой он не работает.
Помимо этого, я думаю, у вас есть опечатка в doPost()
, где вы делаете sc.getAttribute("i");
. Атрибут i
нигде не установлен, поэтому он всегда будет возвращать null
, что вызовет NPE в следующей строке i + currentMessages
.
Кроме того, на всякий случай вы ожидаете, что это будет сумма двух числа вместе - не будет. Он добавит их, поскольку currentMessages
- это String, а +
в String выполняет конкатенацию, независимо от того, какой тип имеет другой операнд.