Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лимитированная по скорости закачка и ее проблемы. 
:(
    Опции темы
mantracoder
Дата 13.10.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.8.2007

Репутация: нет
Всего: 1



Добрый день!

Экспериментирую со скоростью закачки какого-либо файла посредством сервлета. Код написан на коленке за минут 10, посему качество оного предлагается оставить в стороне от обсуждаемой проблемы. Лимит по скорости грубо задается размером массива, который ссыпается в исходящий поток раз в секунду. Закачка работает правильно, лимит скорости соблюдается. Проблема заключается в том, что в единицу времени доступна только 1 закачка. Т.е. если попытаться открыть второе окно и дернуть нужный линк, то вторая закачка если и появится, то останется в подвешенном состоянии, пока не завершится первая. Третья параллельная попытка закачки не дает даже диалога сохранения, пока не завершится одна из двух предыдущих закачек.

Код

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String fileName = request.getParameter("file");
        if (fileName == null) {
            return;
        }
        
        File sourceFile = new File("C:/temp/" + fileName);
        if (!sourceFile.exists() || !sourceFile.isFile()) {
            return;
        }
        
        response.setHeader("Content-Disposition", "attachment; filename=\"" + sourceFile.getName() + "\"");
        response.setHeader("Content-Type", "application/octet-stream");
        response.setHeader("Content-Length", String.valueOf(sourceFile.length()));

        FileInputStream in;
        
        try {
            in = new FileInputStream(sourceFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        }
        
        try {
            
            byte[] buffer = new byte[10240];
            int available = 0;

            while ((available = in.available()) > 0) {
                
                if (available > buffer.length) {
                    available = buffer.length;
                }

                in.read(buffer, 0, available);
                response.getOutputStream().write(buffer, 0, available);
                
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


Изначально я думал, что проблема может быть в блокировании ресурса одним из потоков. Однако если убрать из этого кода любое упоминание файлов и потоков, проблема остается. "Соревнуются" первые 2 запроса к сервлету, третий "висит" до окончания одного из двух предыдущих.

Где-то мне попадалось на глаза утверждение, что разрешается не более 2 конкурентных запросов к одному и тому же ресурсу с одного IP-адреса. И если это действительно так, то как обойти это ограничение?

Это сообщение отредактировал(а) mantracoder - 13.10.2008, 09:01
PM MAIL   Вверх
skhilkov
Дата 13.10.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: 2
Всего: 7



А может просто попробовать в отдельных потоках сделать раздачу? Ты ведь сервлет усыпляешь слипами (если я правильно понимаю). 
Сделай что-нибудь типа (я не компилировал, просто навскидку написал.... так что если ошибки вылезут... я не виноват )))  )

Код

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Runnable job = new Runnable()
{
       public void run()
{
        String fileName = request.getParameter("file");
        if (fileName == null) {
            return;
        }
        
        File sourceFile = new File("C:/temp/" + fileName);
        if (!sourceFile.exists() || !sourceFile.isFile()) {
            return;
        }
        
        response.setHeader("Content-Disposition", "attachment; filename=\"" + sourceFile.getName() + "\"");
        response.setHeader("Content-Type", "application/octet-stream");
        response.setHeader("Content-Length", String.valueOf(sourceFile.length()));
        FileInputStream in;
        
        try {
            in = new FileInputStream(sourceFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        }
        
        try {
            
            byte[] buffer = new byte[10240];
            int available = 0;
            while ((available = in.available()) > 0) {
                
                if (available > buffer.length) {
                    available = buffer.length;
                }
                in.read(buffer, 0, available);
                response.getOutputStream().write(buffer, 0, available);
                
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
}
    };

    (new Thread(r)).start();
}


Это сообщение отредактировал(а) skhilkov - 13.10.2008, 10:19


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
redrick
Дата 13.10.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: нет
Всего: 5



Цитата(mantracoder @  13.10.2008,  08:44 Найти цитируемый пост)
Где-то мне попадалось на глаза утверждение, что разрешается не более 2 конкурентных запросов к одному и тому же ресурсу с одного IP-адреса. И если это действительно так, то как обойти это ограничение?

ну это явно не так: например если мы сидим 100 человек под одним ипишником - мы же можем зайти на один и тот же сайт без проблем.

мне кажется дело в порочности sleep(), хотя палюбому сервер должен заводить новый тред для нового запроса 


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
alexadr
Дата 13.10.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

Репутация: нет
Всего: 4



Я бы посоветовал для начала залогировать каждую строчку сервлета, чтобы понять где толком начинаюца тормоза, - где оно подвисает.

Плюс возможно какие-то проблемы при чтении двумя потоками одного и того же файла(это если в данном случае два клиента скачивают одно и тоже).

Ну и ешо конечно sleep надо менять на:

Код

synchronized(lock) {
   lock.wait(someTime);
}

PM MAIL   Вверх
necromancer
Дата 14.10.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



а может дело в браузере через который дергается закачка? =)
у меня с сервера одновременно льют до 100 потоков и никто не тормозит.
А вот браузер может ограничивать кол-во каким либо образом.
либо же тормозить может система локально, т.е. загрузка проца на 100% при чтении/записи из потоков не дает времени браузеру обработать 3-й клик.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.