什么是一个好的,强大的ASYNC方法来检查Play控制器中是否存在URL?

时间:2012-01-09 14:40:10

标签: java asynchronous playframework

我最初尝试过这个:

private static boolean checkUrlsAreReachable(String... urls) {
    checkArgument(urls.length > 0);

    List<F.Promise<WS.HttpResponse>> promises = newArrayList();
    for (String url : urls) {
        promises.add(WS.url(url).followRedirects(true).timeout("30s").getAsync());
    }

    List<WS.HttpResponse> results = await(F.Promise.waitAll(promises));
    for (WS.HttpResponse response : results) {
        if (!response.success()) {
            logger.debug("Failed accessing one of " + Joiner.on(", ").join(urls));
            return false;
        }
    }

    return true;
}

但我发现了几个警告:

  • 如果相关网址无法妥善处理(例如http://a.com/),我在WS.url(网址)上收到例外。
  • 至少在调试时,似乎对getAsync()块的调用......是否真的在生产中是异步的?我知道Play在开发模式下的线程较少,但我认为这个调用甚至不会在此时开始执行。
  • 如果其中一个URL无法访问,我不知道如何记录哪个URL失败(如何从WS.HttpResponse对象访问URL)

所以,我转而使用同步HTTP而不是异步。以下实现似乎有效:

private static boolean checkUrlsAreReachable(String... urls) {
    checkArgument(urls.length > 0);

    List<F.Promise<Boolean>> promises = newArrayList();
    for (final String url : urls) {
        promises.add(new Job<Boolean>(){
            @Override
            public Boolean doJobWithResult() throws Exception {
                try {
                    WS.HttpResponse result = WS.url(url).followRedirects(true)
                        .timeout("30s").get();
                    return result.success();
                } catch (Exception e) {
                    return false;
                }
            }
        }.now());
    }
    F.Promise<List<Boolean>> allResults = F.Promise.waitAll(promises);
    List<Boolean> booleans = await(allResults);
    return Booleans3.and(booleans);
}

有没有办法让异步实现工作?

1 个答案:

答案 0 :(得分:0)

在application.conf中设置作业池设置部分

# Jobs executor
# ~~~~~~
# Size of the Jobs pool
play.jobs.pool=20

# Execution pool
# ~~~~~
# Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode.
# Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose)
play.pool=5

只需将检查部分放在一个作业中,例如CheckingJob,然后使用

启动它
new CheckingJob().now()

它将是异步的。