3

我需要限制某些外部服务的连接速率(在我的 servlet 中),我决定尝试一下 ScheduledExecutorService。调度本身似乎运行得很好,但输出只是偶尔打印 - 在大多数情况下没有输出任何内容。为什么会发生这种情况?我使用 Tomcat 7 作为测试服务器。

int waitingtimeinmilliseconds = 5000;

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

ScheduledFuture scheduledFuture = scheduledExecutorService.schedule() {

    public void run() {

        Fetcher fetcher = new Fetcher(loginname, password);
        List<Item> items = fetcher.fetchItems();
        // do something with the results

        //ServletOutputStream
        out.print("teststring" + items.size());

    }

}, waitingtimeinmilliseconds, TimeUnit.MILLISECONDS);
scheduledExecutorService.shutdown();
4

1 回答 1

2

您会发现非常详尽的描述是什么导致了您的问题:HttpServletResponse 似乎定期过早发送(另请检查:在 servlet 中启动一个新线程)。

基本上,您不能使用外部线程写入 servlet 输出。一旦你离开doGet()/ doPost(),servlet 容器会假定你已经完成并在将输出刷新到客户端后丢弃它。但是由于您正在异步写入流,因此有时输出会通过,而其他时候会被丢弃。

如果您希望您的速率限制非常可扩展,请考虑使用asyncservlet(从 3.0 开始)。如果你只是想限制一些客户端,RateLimiterfrom 会为你工作1

1 - 请参阅RateLimiter -在我的博客上发现 Google Guava 。

于 2012-10-08T21:45:17.773 回答