Лучший способ загрузки с предельной скоростью в игровой фреймворк Scala - PullRequest
1 голос
/ 16 января 2012

Проблема: ограничение скорости загрузки бинарных файлов.

    def test = {
      Logger.info("Call test action")

      val file = new File("/home/vidok/1.jpg")
      val fileIn = new FileInputStream(file)

      response.setHeader("Content-type", "application/force-download")
      response.setHeader("Content-Disposition", "attachment; filename=\"1.jpg\"")
      response.setHeader("Content-Length", file.lenght + "")

      val bufferSize = 1024 * 1024
      val bb = new Array[Byte](bufferSize)
      val bis = new java.io.BufferedInputStream(is)
      var bytesRead = bis.read(bb, 0, bufferSize)
      while (bytesRead > 0) {
        bytesRead = bis.read(bb, 0, bufferSize)
        //sleep(1000)?
        response.writeChunk(bytesRead)
      }
    }

Но он работает только для текстовых файлов. Как работать с бинарными файлами?

Ответы [ 2 ]

2 голосов
/ 16 января 2012

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

  1. оцените, как быстро вы читаете (= X B / мс)
  2. вычислите разницу между X и скоростью, с которой вы должны были прочитать (= Y мс)
  3. используйте sleep(Y) в потоке загрузки, если необходимо замедлить скорость загрузки

Уже есть большой вопрос об этом прямо здесь , в котором должно быть все, что вам нужно. Я думаю, что особенно решение ThrottledInputStream (которое не является принятым ответом) довольно элегантно.

Несколько моментов, о которых следует помнить:

  • Загрузка с использованием 1 потока для всего - это самый простой способ, однако это также наименее эффективный способ, если вы хотите продолжать обслуживать запросы.
  • Обычно вам нужно хотя бы разгрузить фактическую загрузку файла в отдельный поток.
  • Чтобы ускорить процесс: рассмотрите возможность загрузки файлов порциями (используя HTTP Content-Range) и Java NIO. Однако имейте в виду, что это усложнит ситуацию.
0 голосов
/ 16 января 2012

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

...