由于另一个需要很长时间才能完成的异步调用,GWT中的异步调用会被阻塞

时间:2015-08-07 19:26:13

标签: java gwt asynchronous

我有以下代码,每隔3秒异步执行

<Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
    @Override
    public boolean  execute() {
        try {
            RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "someurl");
            Request response = builder.sendRequest(null, new RequestCallback() {
                public void onError(Request request, Throwable exception) {                     
                }
                public void onResponseReceived(Request request, Response response) {
                // do some work                 
                }
            });
        } catch (RequestException e) {}
        return true;
    }
}, 3000);  

以下代码需要很长时间才能继续。

try {
    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "someurl");
    Request response = builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {                     
        }
        public void onResponseReceived(Request request, Response response) {
            // do some work which takes long time to finish             
        }
    });
} catch (RequestException e) {} 
我希望调度程序每3秒钟调用一次,但是当另一个调用花费更多时间完成调用时,调度程序内部的调用会被阻塞,因为所有调用都不是异步调用。

如果上述情况有任何问题,请告诉我。

2 个答案:

答案 0 :(得分:1)

onResponseReceived在UI线程中执行。由于只有一个UI线程,因此它执行的所有事件都将排队,不会重叠。

答案 1 :(得分:0)

这可能是由连接限制引起的。

在Web浏览器中同时连接到一个域是有限制的。如果超出此限制,连接将排队。

根据网络浏览器,您可以拥有8-6甚至只有2个IE连接。请参阅此question

您可以尝试增加默认限制并检查这是否是问题。