泽西岛1.17的限速

时间:2016-06-28 14:03:57

标签: java rest jersey jetty

我想限制我的REST服务中的下载速率,这是我的代码:

@GET
@Path("/laboDownloadWithLimit")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile()
{
    final File file = new File("SampleVideo_1280x720_50mb.mp4");

    final StreamingOutput streamingOutput = new StreamingOutput()
    {

        @Override
        public void write(
            final OutputStream outputStream)
            throws IOException, WebApplicationException
        {
            final InputStream inputStream = new FileInputStream(file);
            final byte[] buffer = new byte[2048];
            int len;
            while ((len = inputStream.read(buffer)) != -1)
            {
                outputStream.write(buffer, 0, len);
                Thread.sleep(10);
            }
        }

    };
    return Response.ok(streamingOutput)
        .type(MediaType.APPLICATION_OCTET_STREAM_TYPE)
       .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ).build();
}

但我认为存在解决这个问题的更好方法,我应该使用什么?我正在使用Jetty 7.4.5

2 个答案:

答案 0 :(得分:1)

你正在做puts的地方,你可能会考虑使用一些更加谨慎的东西,比如一般化的RateLimiter

答案 1 :(得分:0)

我认为java SDK没有内置方法来限制输入流。我也会质疑为什么你想减慢速度。我必须假设您有性能或拒绝服务问题。

使用jetty DoS Filter可以更好地解决这些问题。我不确定每10毫秒强制线程上下文切换实际上有帮助。实际上,您可能会通过上下文切换引入效率低下而不是必要的。您应该能够依赖正在使用的基础架构。

抱歉,我无法提供实际的异步或回调解决方案:-)