首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有响应的情况下发送HttpRequest OpenEdge

在没有响应的情况下发送HttpRequest OpenEdge
EN

Stack Overflow用户
提问于 2016-11-25 10:58:57
回答 2查看 759关注 0票数 1

我使用IHttpRequest向必须创建消息的服务发送请求。此时,进度过程一直保持到收到来自服务的请求为止,而它应该继续运行。(失火忘却原则)

这是我用来调用服务的类:

代码语言:javascript
复制
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).排除在外了,但是什么也没有发送。

我怎么能在这里使用“火与忘”的原则呢?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-25 21:19:19

据我所知,不可能与IHttpRequest进行异步通信。一个巨大的劣势!

一个可能的解决方法可能是使用一个操作系统实用程序,比如curl或wget来代替调用。有一些方法可以使os调用异步。然而,它们将产生新的过程(而不仅仅是新的线程)。

在windows中,您可以像下面这样做:

代码语言:javascript
复制
OS-COMMAND VALUE("dir") NO-WAIT.

在Unix/Linux中,您可以做到

代码语言:javascript
复制
OS-COMMAND VALUE("ls &").

然而,这将带来新的问题:如何输入/输出数据到wget/curl,如何处理“停留”过程,可能更高的系统负载等等。

票数 0
EN

Stack Overflow用户

发布于 2017-07-12 12:44:03

我知道这已经很晚了--但我补充这一点是为了将来的搜索者的利益。

如果您有一个AppServer,您可以在那里进行异步运行。(如果您愿意的话,甚至可以在流程完成时得到响应。)

如果时间不重要,还有其他可能性--比如将请求添加到队列中,并有一个单独的进程来监视该队列。我正在尝试设置一个IPC机制,告诉后台监视器现在应该查看它,从而最小化队列和脱队列之间的滞后时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40803424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档