Причалил слишком много данных после закрытия для HttpChannelOverHttp

У меня возникли проблемы с загрузкой одного аудиофайла > 10 с, и я получаю эту ошибку:

WARN:oejh.HttpParser:qtp1359061041-19: badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@7fd0cbe{r=5,a=IDLE,uri=-}

Если я загружаю аудиофайл ‹10s, все идет нормально.

Я искал в Google, но не нашел решения для этого. Есть какое-нибудь решение для этого?


person fsi    schedule 19.03.2014    source источник


Ответы (6)


Я использую Cordova 3.3.0, и проблема была в загрузке. Код ниже решил мой случай:

var options = new FileUploadOptions();
    options.fileKey="file";
    options.fileName=name;
    options.mimeType = "audio/amr";
    options.headers = {
        Connection: "close"
    }
    options.chunkedMode = false;

Из-за того, почему пристань продолжает давать мне too much data after closed (постараюсь объяснить). Соединение должно быть закрыто после выполнения другого соединения и запроса. Например, моя загрузка продолжает повторно использовать один и тот же запрос, переполняет запрос и дает мне сообщение. Так что в основном для каждого запроса необходимо закрывать и открывать новый.

Для предосторожности я внес изменения в jetty.xml

<Set name="outputBufferSize"><Property name="jetty.output.buffer.size" default="65536" /></Set>
<Set name="requestHeaderSize"><Property name="jetty.request.header.size" default="16384" /></Set>
<Set name="responseHeaderSize"><Property name="jetty.response.header.size" default="16384" /></Set>
person fsi    schedule 11.04.2014

Это похоже на проблему, обсуждавшуюся здесь http://dev.eclipse.org/mhonarc/lists/jetty-users/msg03919.html

Как вы запускаете Jetty? Это из командной строки, где информация журнала поступает в STOUT? Если это так, вам может потребоваться запустить приложение как службу или настроить более низкий уровень журнала.

person Virmundi    schedule 19.03.2014
comment
Я запускаю сервер java -jar start.jar - person fsi; 19.03.2014
comment
Попробуйте запустить его как процесс или перенаправьте стандарт в /dev/null (при условии, что Linux). - person Virmundi; 21.03.2014

Чтобы запустить сервер из init.d, скопируйте скрипт ${JETTY_HOME}/bin/jetty.sh в папку /etc/init.d/ (если вы хотите запускать jetty во время загрузки системы). Убедитесь, что скрипт имеет права на выполнение. Запустите скрипт как

sudo /etc/init.d/jetty start (я скопировал jetty.sh как jetty в папку /etc/init.d/)

person Dinesh    schedule 25.03.2014
comment
Ну, у меня это не сработало, я передаю файл с 15 секундами меньше 1 МБ и все равно выдаю ту же ошибку. - person fsi; 26.03.2014
comment
Я запускаю службу отдыха, которая принимает данные на Jetty с помощью вышеупомянутой команды. Я могу легко загрузить 100 МБ. Куда загружается файл? Это может быть ошибка запуска приложения Jetty (я предполагаю, что это ваше приложение) - person Dinesh; 26.03.2014
comment
в моей локальной папке: /home/ubuntu/fileuploaded, но это действительно случайно, когда показывается эта ошибка, с 15 секундами звука, иногда это работает, а иногда нет. - person fsi; 26.03.2014
comment
На самом деле то, что я сказал, неверно. Он не вызывает никаких методов в моей службе отдыха. - person fsi; 27.03.2014

В моем случае клиент отправлял больше ключей формы, чем было разрешено получить серверу.

Поэтому мне пришлось установить

WebAppContext webapp = new WebAppContext();
webapp.getServletContext().getContextHandler().setMaxFormKeys(1000000000);

на стороне сервера причала.

person Luca Fagioli    schedule 16.04.2014

Для сотрудников Google я столкнулся с этой проблемой и исправил ее, изменив аннотации параметров с @FormParam на @FormDataParam:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response post(
        @FormParam("name") String name,
        @FormParam("file") InputStream file) {
    //...
}

to:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response post(
        @FormDataParam("name") String name,
        @FormDataParam("file") InputStream file) {
    //...
}

Я работаю на Heroku и, случайно найдя решение, нашел следующую документацию:

Что говорит:

Эту аннотацию в сочетании с типом мультимедиа «multipart/form-data» следует использовать для отправки и использования форм, содержащих файлы, данные, отличные от ASCII, и двоичные данные.

person David Carboni    schedule 20.08.2014

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

person Pieter van Ginkel    schedule 07.02.2015