2013-08-29 2 views
2

웹에서 많은 연구가 이루어졌지만 문제의 해결책을 찾을 수 없습니다. GUI에서 서비스를 호출하고 싶습니다. 서비스 (Rest 메서드)는 스레드와 함께 비동기 처리를 시작합니다. 서비스가 GUI에 즉시 응답하여 GUI가 차단되지 않도록하고 싶습니다. 스레드의 끝에서 서비스는 치료가 완료되었다는 GUI를 나타내는 두 번째 응답을 제공해야합니다.재사용으로 비동기 응답을 가져올 수 없습니다.

내가 원하는 것은 Reasteasy의 비동기 HTTP 부분에 해당하는 것 같습니다. 그래서,이 코드 (난 단지 중요한 내 문제에 대한 부품하자) 시도했다 :

<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.xml에

@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(); 
    } 
} 

을,이 코드를 넣었습니다 : 웹 서비스가 즉시 응답하지 않습니다. 스레드의 끝에서만 응답을 보내고 GUI는 차단됩니다. 코드를 살펴보면 서비스가 즉시 "무효"응답으로 응답을 제공 할 수있는 방법을 이해하지 못합니다.

정보 : 웹 서비스 호출은 Javascript 프레임 워크 인 ExtJS에서 이루어집니다. Ajax 요청을한다.

누군가가이 문제로 나를 도울 수 있다면 좋을 것입니다. 미리 감사드립니다.

세드릭

답변

6

이 문제를 해결하려면 두 가지 다른 웹 서비스를 사용해야합니다.

AsynchronousResponse은 주로 클라이언트 측이 아니라 서버 스레드 풀 성능을 돕는 데 사용됩니다.

서버에는 클라이언트 요청을 처리 할 수있는 스레드 풀에 제한된 수의 스레드가 있으며 AsynchronousResponse의 도움으로 백그라운드 스레드에 시간이 많이 걸리는 작업을 넣을 수 있습니다.

클라이언트 측에서는 비동기 프로세스가 완료되거나 시간 초과 될 때까지 기다려야합니다. 그 후에 만 ​​응답이 커밋되므로 클라이언트의 경우 요청을 완료하는 데 거의 동일한 시간이 걸립니다.

다른 옵션은 hereChunkedOutput 자바 클래스를 시험해 보는 것입니다.

"입력 된"청크로 메시지를 보내기위한 것입니다. 부분 응답을 생성해야하는 장기 실행 프로세스에 유용합니다.

예 :

@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

관련 문제