У меня есть старое приложение, в котором клиент загружает большие файлы через очень медленное соединение (GPRS). В настоящее время мы используем Spring MVC и более старый стандарт сервлетов 2.0 и получаем входной поток запроса напрямую, что, очевидно, приводит к длительным заблокированным потокам. Мне было поручено обновить приложение до сервлета 3.1, чтобы воспользоваться преимуществами нового прослушивателя асинхронного чтения (который считался простым!!), однако я зашел в тупик.
Проведение прямого обновления приложения до сервлета 3.1 прошло нормально, игнорируя тот факт, что я возвращал ответ сразу, поскольку меня больше заботило тестирование того факта, что сам файл был загружен правильно и onDataAvailable() вызывался правильно несколько раз. Проблема возникает, когда я начал использовать объект DeferredResult (который, кажется, был более или менее изобретен для этой цели), чтобы вернуть имя представления контроллеру, поскольку мне нужно, очевидно, сообщить клиенту, была ли загрузка успешной или нет, и я не вижу другого способа сделать это в этой асинхронной среде.
Когда я возвращаю объект DeferredResult, он сразу же неправильно возвращается клиенту, и при первом вызове onDataAvailable() входной поток не может быть прочитан. от того, как я получаю исключение java.io.IOException: закрытый поток. Вызов getDispatcherType() сообщает мне, что тип теперь переключился на DispatcherType.ERROR, тогда как когда я запускаю код без объекта DeferredResult (и отвечаю сразу, несмотря ни на что), тип по-прежнему остается DispatcherType.REQUEST. Я думал, что где-то в стеке входной поток считывается раньше (не мной) и вызывает это, но, похоже, это не так, и странно то, что inputStream.isReady() возвращает true, а inputStream.isFinished() возвращает false, и я вижу текст из файла в буфере при первом onDataAvailable(), но я просто не могу читать из входного потока напрямую, не получая исключение java.io.IOException: Stream Closed.
Нет суммы тестирование с крошечными файлами или действительно большими файлами меняет поведение этого. Кто-нибудь успешно использовал DeferredResult в Spring MVC и сервлете 3.1? Я уже несколько дней в тупике и снова отладил больше кода, чем хотелось бы!
Вот мой код (некоторые бизнес-материалы вырезаны на случай, если вам покажется, что он немного анемичен)
@Controller
public class ContentController {
@RequestMapping(value = “/upload/“, method = POST)
public DeferredResult upload(ServletRequest request) throws IOException, InterruptedException {
DeferredResult deferredResult = new DeferredResult();
final AsyncContext asyncContext = httpServletRequest.startAsync();
ServletInputStream servletInputStream = httpServletRequest.getInputStream();
NioReadListener readListener = new NioReadListener(servletInputStream, asyncContext, deferredResult, size);
servletInputStream.setReadListener(readListener);
return deferredResult
}
public class NioReadListener implements ReadListener {
private final ServletInputStream _input;
private final AsyncContext _context;
private final DeferredResult deferredResult;
public NioReadListener(ServletInputStream servletInputStream, AsyncContext asyncContext, DeferredResult deferredResult, Long size) throws IOException {
this._input = servletInputStream;
this._context = asyncContext;
this.deferredResult = deferredResult;
}
@Override
public void onDataAvailable() throws IOException {
try {
int bytesRead;
byte b[] = new byte[_size.intValue()];
while (_input.isReady() && (bytesRead = _input.read(b)) != -1) {
_totalBytesRead += bytesRead;
}
} catch (IOException e) {
_log.error(e);
}
}
@Override
public void onAllDataRead() throws IOException {
this._context.complete();
deferredResult.setResult("VIEW_NAME");
}
}
Подробнее здесь: https://stackoverflow.com/questions/327 ... rredresult
InputStream закрыт при использовании DeferredResult ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1768579732
Anonymous
У меня есть старое приложение, в котором клиент загружает большие файлы через очень медленное соединение (GPRS). В настоящее время мы используем Spring MVC и более старый стандарт сервлетов 2.0 и получаем входной поток запроса напрямую, что, очевидно, приводит к длительным заблокированным потокам. Мне было поручено обновить приложение до сервлета 3.1, чтобы воспользоваться преимуществами нового прослушивателя асинхронного чтения (который считался простым!!), однако я зашел в тупик.
Проведение прямого обновления приложения до сервлета 3.1 прошло нормально, игнорируя тот факт, что я возвращал ответ сразу, поскольку меня больше заботило тестирование того факта, что сам файл был загружен правильно и onDataAvailable() вызывался правильно несколько раз. Проблема возникает, когда я начал использовать объект DeferredResult (который, кажется, был более или менее изобретен для этой цели), чтобы вернуть имя представления контроллеру, поскольку мне нужно, очевидно, сообщить клиенту, была ли загрузка успешной или нет, и я не вижу другого способа сделать это в этой асинхронной среде.
Когда я возвращаю объект DeferredResult, он сразу же неправильно возвращается клиенту, и при первом вызове onDataAvailable() входной поток не может быть прочитан. от того, как я получаю исключение java.io.IOException: закрытый поток. Вызов getDispatcherType() сообщает мне, что тип теперь переключился на DispatcherType.ERROR, тогда как когда я запускаю код без объекта DeferredResult (и отвечаю сразу, несмотря ни на что), тип по-прежнему остается DispatcherType.REQUEST. Я думал, что где-то в стеке входной поток считывается раньше (не мной) и вызывает это, но, похоже, это не так, и странно то, что inputStream.isReady() возвращает true, а inputStream.isFinished() возвращает false, и я вижу текст из файла в буфере при первом onDataAvailable(), но я просто не могу читать из входного потока напрямую, не получая исключение java.io.IOException: Stream Closed.
Нет суммы тестирование с крошечными файлами или действительно большими файлами меняет поведение этого. Кто-нибудь успешно использовал DeferredResult в Spring MVC и сервлете 3.1? Я уже несколько дней в тупике и снова отладил больше кода, чем хотелось бы!
Вот мой код (некоторые бизнес-материалы вырезаны на случай, если вам покажется, что он немного анемичен)
@Controller
public class ContentController {
@RequestMapping(value = “/upload/“, method = POST)
public DeferredResult upload(ServletRequest request) throws IOException, InterruptedException {
DeferredResult deferredResult = new DeferredResult();
final AsyncContext asyncContext = httpServletRequest.startAsync();
ServletInputStream servletInputStream = httpServletRequest.getInputStream();
NioReadListener readListener = new NioReadListener(servletInputStream, asyncContext, deferredResult, size);
servletInputStream.setReadListener(readListener);
return deferredResult
}
public class NioReadListener implements ReadListener {
private final ServletInputStream _input;
private final AsyncContext _context;
private final DeferredResult deferredResult;
public NioReadListener(ServletInputStream servletInputStream, AsyncContext asyncContext, DeferredResult deferredResult, Long size) throws IOException {
this._input = servletInputStream;
this._context = asyncContext;
this.deferredResult = deferredResult;
}
@Override
public void onDataAvailable() throws IOException {
try {
int bytesRead;
byte b[] = new byte[_size.intValue()];
while (_input.isReady() && (bytesRead = _input.read(b)) != -1) {
_totalBytesRead += bytesRead;
}
} catch (IOException e) {
_log.error(e);
}
}
@Override
public void onAllDataRead() throws IOException {
this._context.complete();
deferredResult.setResult("VIEW_NAME");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/32700617/inputstream-closed-when-using-deferredresult[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия