在 Progress OpenEdge 中发送没有响应的 HttpRequest
Send an HttpRequest without response in Progress OpenEdge
我正在使用 IHttpRequest 向必须创建消息的服务发送请求。
此时 Progress 过程会一直保持,直到它收到来自服务的请求,而它应该继续。 (即发即弃原则)
这是我用来调用服务的class:
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).
排除在外,但没有发送任何内容。
如何在这里使用"fire and forget"原则?
提前致谢。
据我所知,os无法与 IHttpRequest 进行异步通信。一个巨大的劣势!
possible 解决方法可能是使用 OS 实用程序(如 curl 或 wget)来代替调用。有多种方法可以使 os 调用异步。然而,它们会产生新过程(而不仅仅是新线程)。
在 windows 中,您可以像这个基本示例那样做:
OS-COMMAND VALUE("dir") NO-WAIT.
在Unix/Linux你可以做到
OS-COMMAND VALUE("ls &").
然而这会引入新的问题:如何input/output数据到wget/curl,如何处理"stay"程序,pos可能更高的系统负载等
我知道这已经很晚了 -- 但我添加这个是为了将来的搜索者的利益。
如果您有 AppServer,则可以在那里执行异步 运行。 (如果您愿意,甚至可以在流程结束时得到回复。)
如果时间不是很重要,还有其他可能性——比如将请求添加到队列中并有一个单独的进程来监视该队列。我正在考虑建立一个 IPC 机制来告诉后台监视器它现在应该看起来,从而最大限度地减少排队和出队之间的滞后时间。
我正在使用 IHttpRequest 向必须创建消息的服务发送请求。 此时 Progress 过程会一直保持,直到它收到来自服务的请求,而它应该继续。 (即发即弃原则)
这是我用来调用服务的class:
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).
排除在外,但没有发送任何内容。
如何在这里使用"fire and forget"原则?
提前致谢。
据我所知,os无法与 IHttpRequest 进行异步通信。一个巨大的劣势!
possible 解决方法可能是使用 OS 实用程序(如 curl 或 wget)来代替调用。有多种方法可以使 os 调用异步。然而,它们会产生新过程(而不仅仅是新线程)。
在 windows 中,您可以像这个基本示例那样做:
OS-COMMAND VALUE("dir") NO-WAIT.
在Unix/Linux你可以做到
OS-COMMAND VALUE("ls &").
然而这会引入新的问题:如何input/output数据到wget/curl,如何处理"stay"程序,pos可能更高的系统负载等
我知道这已经很晚了 -- 但我添加这个是为了将来的搜索者的利益。
如果您有 AppServer,则可以在那里执行异步 运行。 (如果您愿意,甚至可以在流程结束时得到回复。)
如果时间不是很重要,还有其他可能性——比如将请求添加到队列中并有一个单独的进程来监视该队列。我正在考虑建立一个 IPC 机制来告诉后台监视器它现在应该看起来,从而最大限度地减少排队和出队之间的滞后时间。