头脑风暴的想法,以克服Heroku的30秒超时和HTMLUnit的慢页面渲染

时间:2014-06-07 08:26:21

标签: java heroku htmlunit

我有一个奇怪的问题。

我正在进行一些屏幕抓取,然后将数据呈现给我的用户进行一些选择。我对我正在使用的网站没有任何控制权,我需要他们首先执行他们的Javascript。

这个过程在本地工作正常,只需要一分钟就可以完成所有事情。但是当我推送到Heroku时,请求在30秒后超时,虽然我可以看到日志,但实际处理仍在继续。

您能推荐其中一种解决方案,还是其他替代方案:

  1. 以某种方式增加Heroku的超时 - 我相信这是不可能的(我使用PlayFramework 1.2.7和Java)
  2. 以某种方式加速HTMLUnit - 我已经粘贴了我的代码
  3. 以不同的方式获取页面HTML - 我需要的是HTML - 在Javscript(Ajax)执行之后。有更好/更快的方法吗?
  4. 分两步完成工作,首先使用HTMLUnit抓取页面代码并将其保存到数据库中。然后从数据库中获取页面代码并对其进行一些处理。这就是我能想到的全部。
  5. 代码:

    LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
    java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
    java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);
    
    WebClient webClient = new WebClient();
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.waitForBackgroundJavaScript(20000);
    
    Page page = webClient.getPage(url);
    WebResponse response = page.getWebResponse();
    String html = response.getContentAsString();
    

1 个答案:

答案 0 :(得分:0)

运行长时间运行的进程的正确方法是使用异步工作程序。即使是需要5秒钟的进程也会锁定您的Web工作者一段时间(假设您正在运行同步工作程序),因此将这些任务委派给异步工作人员总是明智的。

按照本指南开始使用:https://devcenter.heroku.com/articles/asynchronous-web-worker-model-using-rabbitmq-in-java