【问题标题】:Sometimes nothing is printed to servlet's output stream, when inside a scheduled task有时在计划任务中没有任何内容打印到 servlet 的输出流
【发布时间】:2012-10-08 21:37:20
【问题描述】:

我需要限制某些外部服务的连接速率(在我的 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();

【问题讨论】:

  • 为什么不简单的 Thread.sleep(5000)
  • 变量 'waitingtimeinmilliseconds' 实际上是由过滤器生成的。需要注意的是,到外部服务的两个连接之间总是至少有一定的时间间隔(每个 servlet 线程一个外部服务访问)。

标签: java servlets scheduling


【解决方案1】:

您可以在HttpServletResponse seems to periodically send prematurely 中找到非常详尽的问题描述说明(另请查看:starting a new thread in servlet)。

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

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

1 - 在我的博客上查看 RateLimiter - discovering Google Guava

【讨论】:

  • 谢谢。我去看看那个帖子。我刚刚注意到,如果 servlet 似乎没有输出任何内容供我基于 AJAX 的 GUI 使用,如果我刷新浏览器,我可能会在 之前看到想要的输出。稍后我可能不得不选择一个不支持 Tomcat 7(仅支持 Tomcat 6)的 PaaS 提供商,它只支持 Servlet 规范 2.5,但我会认真考虑使用异步 servlet。
  • 我现在明白这是关于比赛条件的。但是,通过使用异步 servlet 并在 AsyncListeners 的 onComplete 方法中输出,我现在遇到了一种情况,即一切都运行良好(输出总是与预期完全相同)。我想补充一点,将“asyncSupported = true”添加到 WebServlet 注释是不够的。我必须设置以下属性: req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
  • 这是一个关于使用异步 servlet 的简单示例(非常有用的功能):developerlife.com/tutorials/?p=1437
  • @MarkoSeppänen:我从来不需要使用这个特殊属性,但是我找到了this。请注意,一旦开始异步处理,您就可以随时从任何线程写入OutputStream。不一定来自onComplete()
猜你喜欢
  • 2021-03-26
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2021-02-06
  • 2020-02-06
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多