2013-08-29 61 views
2

儘管在Web上進行了許多研究,但我找不到任何解決方案。 我想從GUI調用服務。服務(Rest方法)通過線程啓動異步處理。我希望服務立即給GUI一個響應,以便GUI不被阻塞。在線程結束時,服務應該給出第二個響應,指示完成處理的GUI。無法通過reasteasy獲得異步響應

我想要做的事似乎對應於Reasteasy的異步HTTP部分。所以,我已經試過這個代碼(我只讓我的問題的重要組成部分):

@PUT 
@Path("/duplicate/1") 
public void duplicate( UcModel uc, 
           final @Suspend(TIMEOUT_ASYNCHRONOUS_DUPLICATION) AsynchronousResponse response) throws BusinessException { 


     Thread t = new Thread() { 
      @Override 
      public void run() { 

       try { 
        Thread.sleep(40000); 
       } catch (InterruptedException e) { 
       } 

       Response jaxrs = Response.ok(result).build(); 
       response.setResponse(jaxrs); 
      } 
     }; 
     t.start(); 
    } 
} 

在我的web.xml,我已經把這個代碼:

<servlet> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <servlet-class> 
     org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher 
    </servlet-class> 
    <async-supported>true</async-supported> 
</servlet> 

的問題:Web服務不會立即給出響應。它僅在線程結束時給出響應,並且GUI被阻止。 通過查看代碼,我甚至不明白服務如何立即給出一個「無效」結果的響應。

有關信息:Web服務的調用是在JavaScript框架ExtJS中進行的。它執行一個Ajax請求。

如果有人能幫助我解決這個問題,那將會很棒。在此先感謝

Cedric

回答

6

您應該使用兩種不同的Web服務來解決此問題。

AsynchronousResponse主要用於幫助服務器線程池的性能,而不是爲客戶端。

服務器線程池中的線程數量有限,可以滿足客戶端的請求,在AsynchronousResponse的幫助下,您可以將耗時的工作放在後臺線程中。

客戶端將不得不等待異步進程完成或超時。只有在此之後纔會做出響應,因此對於客戶來說,完成請求幾乎需要相同的時間。

其他選項是嘗試ChunkedOutput java類可以找到here

這是用於以「鍵入」塊發送消息。對於需要產生部分響應的長時間運行的流程很有用。

一個例子:

@Path("/test") 
public class TestResource { 
    @GET 
    public ChunkedOutput getTestResponse() { 
     final ChunkedOutput chunkedOutputs = new ChunkedOutput(String.class); 
     new Thread() { 
      public void run() { 
       try {     
        while (hasNextValue()) {       
         chunkedOutputs.write(getNextLongRunningOperationValue()); 
        }      
       } catch (IOException e) { 
        (...) 
       } finally { 
        chunkedOutputs.close();       
       } 
      } 
     }.start(); 
     //the chunkedOutputs will be probably returned even before a first value is written by the new thread 
     return chunkedOutputs; 
    } 

    private boolean hasNextValue() { 
     (...) 
    } 

    private String getNextLongRunningOperationValue() { 
     (...) //this takes a lot of time, so it's time for a coffee :)   
    } 
}
+0

謝謝您的答覆。不幸的是,我沒有足夠的時間來嘗試這個解決方案,因爲我今天離開了我的項目。所以,我的解決方法是完全刪除我的方法的異步部分,並確保客戶端不會被處理請求阻止。我給你的回覆給我的同事,也許有人會有一段時間來看看它,並嘗試彗星解決方案 – user2622053

+0

好吧,祝你好運,請不要忘記投票,如果答案對你有用 –

+0

我試過了投票,但我是這個論壇的初學者,所以我沒有足夠的投票聲望 – user2622053