2012-01-23 2 views
0

Я пишу приложение для передачи данных с использованием сервлета и хотел бы иметь возможность отправлять ответ об ошибке, если возникла проблема после написания ответа сервлета. Это возможно?Отправка ответа об ошибке после ответа сервлета на

Моя проблема заключается в том, что я буду отправлять большие сжатые CSV-файлы, созданные из данных, считанных из базы данных. Все делается с потоками, поэтому возможно возникновение ошибки при создании файла csv после того, как был отправлен ответ сервлета. Я видел, как это произошло.

Я заметил, что это проблема только после сброса сервлета OutputStream. Если он не был сброшен, я могу отправить ответ об ошибке, но не после него. Поскольку я имею дело с большими объемами данных, не представляется возможным отправить все за один раз.

ответ

1

Я пишу приложение передачи данных с использованием сервлет и хотел бы иметь возможность отправить ошибочный ответ, если проблема возникает после того, как ответ сервлета был записан. Это возможно?

Не со стороны сервера. Сервер не может взять уже сброшенные байты обратно с клиента. Это точка невозврата. Я предполагаю, что это относится к другому исключению, кроме IOException, по ответу Writer или OutputStream.

Если бы HTML (несмотря на то, что это плохая практика, HTML принадлежит JSP), вы могли печати некоторые JS код, который заставляет изменение местоположения так:

try { 
    writer.write(someHtml); 
} catch (SomeException e) { 
    writer.write("<script>window.location = 'error.jsp';</script>"); 
    // ... 
} 

Но это не возможно в ответах, отличных от HTML. Вам действительно нужно предварительно запрограммировать весь ответ в памяти или на диске (temp). Если буферизация прошла безупречно, вы можете снова отправить ее на ответ.

try { 
    processAndSaveInMemoryOrTempDiskFile(someData, byteArrayOrFileLocation); 
} catch (SomeException e) { 
    throw new ServletException(e, "Processing some data failed."); 
} 

copyFromMemoryOrTempDiskToResponse(byteArrayOrFileLocation, writer);