0

我们正在开发一种 SAP ICF 服务 (HTTP),它允许移动设备通过 XML 接口调用功能模块。给定的 XML 包含有关要调用的功能模块和必须使用的参数的数据。每当功能模块完成时,结果就会被发送回移动设备。我们正在使用IF_HTTP_EXTENSION处理程序。

问题是,每当功能模块运行时间较长时,移动设备就会超时,然后关闭连接,重新连接并重新发送请求。每当发生这种情况时,处理程序的handle_request方法会IF_HTTP_EXTENSION立即终止。但是我们需要继续执行被调用的函数,因为客户端以相同的序列号重新发送请求。所以我们不调用实际函数两次,而是一个“等待”方法,它等待之前调用的函数完成。我们通过定期检查数据库来做到这一点(在每次迭代中循环)WHILEWAIT UP TO 2 SECONDS

只要客户端没有超时,我们希望尽快发送响应。因此,在第一个请求中,不适合进行 2 秒延迟的 while 循环。

我们目前的方法如下(in handle_request):

CALL FUNCTION 'CLIENT_DESIRED_FUNCTION'
    STARTING NEW TASK l_client_id
    CALLING processing_finished ON END OF TASK
    EXPORTING
        ...

在此之后,我们通过以下方式等待其完成:

WAIT UNTIL a_running <> 'X'.

但是,一旦客户端断开连接,被调用的函数(以及handle_request方法)就会终止。

当我们删除 时CALLING processing_finished ON END OF TASK,函数实际上还在继续!这是我们想要的行为。但是,现在没有办法等待函数完成,因为WAIT UNTIL语句返回sy-subrc = 4(No async rfc function calls)。

我们可以只使用一个简单的WHILE--WAIT UP TO 2 SECONDS循环,但是我们有延迟,这是我们真正想要防止的。我们考虑的另一个解决方案是在超时发生之前向客户端发送 HTTP 代码 102。但这不是一个好的解决方案,因为移动设备可能没有网络,然后没有及时收到 102。

有没有办法阻止 SAP ICF 终止该handle_request方法,或者是否可以在不使用参数的情况下有效地等待异步任务CALLING ... ON END OF TASK

亲切的问候,托拜厄斯

4

1 回答 1

0

我手头没有代码,但是在 SAP Gateway 不存在并且您必须构建自己的 REST 服务之前,我已经解决了这个问题。

我使用超时处理 2 秒。在那之后,服务器必须回复一些东西。如果处理未完成(使用 async 功能模块),则服务器以 HTTP 状态 202 Accepted 进行响应。然后,客户端可能会在稍后发送另一个请求,询问前一个请求的状态。

这种模式效果很好。前端开发人员对所有请求都使用了异步模型,创建了一个即使 SAP 中的响应时间确实不同,也不会出现延迟的应用程序。例如,在高峰时段提交销售订单可能需要 1 到 15 秒。

于 2016-04-15T07:04:40.787 回答