2016-11-25 5 views
1

IHttpRequest를 사용하여 메시지를 만들어야하는 서비스에 요청을 보내고 있습니다. 현재 진행 절차는 서비스에서 요청을받을 때까지 유지되지만 계속 진행해야합니다.진행 상태에서 응답없이 HttpRequest 보내기 OpenEdge

USING Progress.Lang.*. 

USING OpenEdge.Net.HTTP.ClientBuilder. 
USING OpenEdge.Net.HTTP.IHttpRequest. 
USING OpenEdge.Net.HTTP.IHttpResponse. 
USING OpenEdge.Net.HTTP.RequestBuilder. 
USING Progress.Json.ObjectModel.JsonObject. 

BLOCK-LEVEL ON ERROR UNDO, THROW. 

CLASS TOOLS.externals.zato.SendDesadv: 

    DEFINE VARIABLE baseURL  AS CHARACTER  NO-UNDO. 
    DEFINE VARIABLE servicePath AS CHARACTER  NO-UNDO INITIAL send/json". 
    DEFINE VARIABLE serviceURL AS CHARACTER  NO-UNDO. 
    DEFINE VARIABLE oRequest AS IHttpRequest NO-UNDO. 
    DEFINE VARIABLE oResponse AS IHttpResponse NO-UNDO. 
    DEFINE VARIABLE input_json AS JsonObject NO-UNDO. 

    CONSTRUCTOR PUBLIC SendDesadv (INPUT wave_nr AS INTEGER):    
     input_json = NEW JsonObject(). 
     input_json:Add("wave_nr", wave_nr). 
     invokeZato(input_json).   
    END CONSTRUCTOR. 

    METHOD PUBLIC VOID invokeService(INPUT input_json AS JsonObject): 
     setServiceUrl(). 

     SESSION:DEBUG-ALERT = TRUE. 
     oRequest = RequestBuilder:Put(serviceURL, input_json) 
      :AcceptJson() 
      :REQUEST. 
     oResponse = ClientBuilder:Build():Client:Execute(oRequest). 
    END METHOD. 

    METHOD PUBLIC VOID setBaseUrl(): 
     IF LENGTH(PDBNAME(2)) = 3 
      THEN baseURL = "http://foo". 
     ELSE baseURL = "http://bar". 

    END METHOD. 

    METHOD PUBLIC VOID setServiceUrl():  
     setBaseUrl(). 
     serviceUrl = baseUrl + servicePath. 
    END METHOD. 
END CLASS. 

이미 그냥 밖으로 oResponse = ClientBuilder:Build():Client:Execute(oRequest).를 떠나 시도했다, 그러나 아무것도 전송하지 않습니다 : (화재 및 원칙을 잊지는)

이 나는 ​​서비스에 전화를 걸 때 사용하는 클래스입니다.

여기서 "불과 잊음"원칙을 어떻게 사용할 수 있습니까?

미리 감사드립니다.

답변

0

내가 아는 한 IHttpRequest와의 비동기 통신을 수행 할 수 없습니다. 거대한 단점!

가능한 해결 방법은 curl 또는 wget 같은 호출 유틸리티 대신 OS 유틸리티를 사용하는 것입니다. os를 비동기 적으로 호출하는 방법이 있습니다. 그러나 그들은 새 프로 시저를 생성 할뿐 아니라 새 스레드도 생성합니다.

이 기본 예제와 같이 할 수있는 창에서

: 유닉스/리눅스에서

OS-COMMAND VALUE("dir") NO-WAIT. 

당신은

OS-COMMAND VALUE("ls &"). 

이 그러나 새로운 문제를 소개 할 수있는 : 입/출력 데이터에 어떻게 wget 용/curl, "stay"절차를 처리하는 방법, 더 높은 시스템 부하 등.

1

나는 이것이 아주 늦었다 고 알고있다 - 그러나 나는 장래의 검색 자의 이익을 위해 이것을 추가한다.

AppServer가있는 경우 비동기 실행을 수행 할 수 있습니다.

타이밍이 중요하지 않은 경우 큐에 요청을 추가하고 해당 큐를 모니터링하는 별도의 프로세스가있는 것과 같은 다른 가능성이 있습니다 (프로세스가 완료되면 프로세스가 완료되면 응답을 얻을 수도 있습니다). . IPC 메커니즘을 설정하여 백그라운드 모니터에 지금보아야한다고 알려주므로 대기열과 대기열에서 지연 시간을 최소화합니다.

관련 문제