2016-11-25 10 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を非同期に呼び出す方法があります。しかし、彼らは新しい手続きを生み出します(新しいスレッドだけでなく)。

あなたはこの基本的な例のように行うことができますWindowsで

:UNIX/Linuxの場合

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

ます。これは、しかし、新たな問題紹介します

OS-COMMAND VALUE("ls &"). 

を行うことができます。wgetのために、入力/出力データにどのように/カール、 "滞在"手順、おそらくより高いシステム負荷などを処理する方法。

1

私はこれがかなり遅いことを知っていますが、これを将来のサーチャーのために追加します。

AppServerをお持ちの場合は、非同期で実行することができます。

タイミングが重要でない場合は、リクエストをキューに追加し、そのキューを監視するための別のプロセスを持つようにすることもできます(たとえば、プロセスが終了したら応答を返すこともできます) 。バックグラウンドモニタに今すぐ見えるように指示するIPCメカニズムを設定し、キューとデキューの遅延時間を最小限に抑えるというアイデアを思いついています。

関連する問題