Java Play 2.2未与web服务响应处理程序并行处理的操作

Java Play 2.2未与web服务响应处理程序并行处理的操作,java,web-services,playframework,playframework-2.0,Java,Web Services,Playframework,Playframework 2.0,客户端首先调用action1,然后调用action2。然而,似乎Play会在这10秒后处理第二个请求。我认为来自web服务的响应是由Play在单独的线程中处理的,但这似乎不是真的。在这种情况下,如果我想在超时后睡觉或执行一些代码,而不中断服务器服务其他请求,我应该怎么做 编辑:当来自WS的响应在客户端调用action2之前到达时,会发生这种情况。默认情况下,Play分配的线程数与您拥有的CPU内核数相同,但请注意,存在多个线程池,因此,如果您想执行阻塞操作(如在处理程序中睡眠),请将其配置为分配

客户端首先调用action1,然后调用action2。然而,似乎Play会在这10秒后处理第二个请求。我认为来自web服务的响应是由Play在单独的线程中处理的,但这似乎不是真的。在这种情况下,如果我想在超时后睡觉或执行一些代码,而不中断服务器服务其他请求,我应该怎么做


编辑:当来自WS的响应在客户端调用action2之前到达时,会发生这种情况。

默认情况下,Play分配的线程数与您拥有的CPU内核数相同,但请注意,存在多个线程池,因此,如果您想执行阻塞操作(如在处理程序中睡眠),请将其配置为分配更多线程。

不确定您试图实现什么,但下面的代码将在WS-call返回和返回ok结果之间插入10秒延迟:

public class Application extends Controller {

    @BodyParser.Of(BodyParser.Json.class)
    public static Result action1() {
        WS.url(WS_URL).get().map(new Function<WS.Response, Result>() {
            public Result apply(WS.Response response) {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return null;
            }
        });
        return ok();
    }

    @BodyParser.Of(BodyParser.Json.class)
    public static Result action2() {
        return ok();
    }
}
要了解Play的线程池,请阅读以下内容:

要了解Play如何与承诺一起工作,请阅读以下内容:


您确定客户端在调用操作2之前没有等待操作1完成吗?你能给我看一下客户端代码吗?不,不能等。实际上,服务器在将请求发送到WS后立即从action1返回,但是WS的响应似乎是由处理操作的同一线程处理的。我忘了提到来自WS的响应在客户端调用action2之前到达。当用户单击我站点上的按钮时,服务器会执行多个WS调用,这些调用返回的响应用于更新对象列表。同时,客户机定期发送AJAX请求,以检查列表中的任何对象是否已更新。问题是AJAX请求是在所有WS调用返回之后提供的,而不是像我预期的那样并行。我找到的解决方案是使用Akka系统在单独的thred中进行每个WS调用。您是否在调用WS API返回的承诺?如果您是,那么基本上您将您的应用程序变成了一个同步阻塞应用程序,并且您看到的行为是预期的。永远不要在承诺上调用get。不,我不调用get。事实上,我找到的解决方案是使用Akka系统在单独的thred中进行每个WS调用。
public static F.Promise<SimpleResult> action1() {
    return WS.url(WS_URL).get().flatMap(new Function<WS.Response, F.Promise<WS.Response>>() {
        public F.Promise<WS.Response> apply(WS.Response response) {
           return F.Promise.timeout(response, 100000);
        }
    }).map(new Function<WS.Response, SimpleResult>() {
        public SimpleResult apply(WS.Response response) {
           return ok();
        }
    };
}