Я пытаюсь сервлет не блокировать ввод / вывод.Я выполняю свой код в контейнере Cloud Foundry с Tomcat 8.5.
Я получаю 500 внутренних ошибок при загрузке файла размером 200 МБ.
То же самое работает, если я загружаюфайл размером около 20 МБ.
Я подозреваю некоторую проблему в контейнере Tomcat, где он не может обрабатывать неблокирующую обработку ввода-вывода.
Ниже приведен мой код
@WebServlet(urlPatterns = { "/asyncUpload" }, asyncSupported = true)
public class AsyncUploadTester extends HttpServlet {
Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
final AsyncContext acontext = request.startAsync();
HttpServletResponse asyncresponse = (HttpServletResponse) acontext.getResponse();
final ServletInputStream input = request.getInputStream();
Instant start = Instant.now();
logger.info("Inside doPost of asyncupload");
input.setReadListener(new ReadListener() {
byte buffer[] = new byte[4 * 1024];
StringBuilder sbuilder = new StringBuilder();
@Override
public void onDataAvailable() {
try {
do {
logger.info("reading data");
int length = input.read(buffer);
sbuilder.append(new String(buffer, 0, length));
} while (input.isReady());
} catch (IOException ex) {
logger.error(" IO error from onDataAvailable" + ex);
} catch (Exception e) {
logger.error(" error from onDataAvailable" + e);
}
}
@Override
public void onAllDataRead() {
try {
asyncresponse.getWriter().println(" Async upload done");
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
asyncresponse.getWriter().println(" Total time taken " + timeElapsed.toMillis() + " milliseconds");
asyncresponse.setStatus(HttpServletResponse.SC_CREATED);
logger.info("File upload done");
} catch (IOException ex) {
logger.error("IO error from onAllDataRead" + ex);
asyncresponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} catch (Exception e) {
logger.error(" error from onDataAvailable" + e);
}
acontext.complete();
}
@Override
public void onError(Throwable t) {
logger.error("error from onError" + t);
}
});
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.getWriter().append(" Get called in Async upload");
}
}