2013-08-29 34 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