Внутренняя ошибка 500 в неблокирующем выполнении сервлета - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь сервлет не блокировать ввод / вывод.Я выполняю свой код в контейнере 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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...