我想限制我的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
答案 0 :(得分:1)
你正在做puts
的地方,你可能会考虑使用一些更加谨慎的东西,比如一般化的RateLimiter
。
答案 1 :(得分:0)
我认为java SDK
没有内置方法来限制输入流。我也会质疑为什么你想减慢速度。我必须假设您有性能或拒绝服务问题。
使用jetty DoS Filter可以更好地解决这些问题。我不确定每10毫秒强制线程上下文切换实际上有帮助。实际上,您可能会通过上下文切换引入效率低下而不是必要的。您应该能够依赖正在使用的基础架构。
抱歉,我无法提供实际的异步或回调解决方案:-)