我们正在开发一种 SAP ICF 服务 (HTTP),它允许移动设备通过 XML 接口调用功能模块。给定的 XML 包含有关要调用的功能模块和必须使用的参数的数据。每当功能模块完成时,结果就会被发送回移动设备。我们正在使用IF_HTTP_EXTENSION
处理程序。
问题是,每当功能模块运行时间较长时,移动设备就会超时,然后关闭连接,重新连接并重新发送请求。每当发生这种情况时,处理程序的handle_request
方法会IF_HTTP_EXTENSION
立即终止。但是我们需要继续执行被调用的函数,因为客户端以相同的序列号重新发送请求。所以我们不调用实际函数两次,而是一个“等待”方法,它等待之前调用的函数完成。我们通过定期检查数据库来做到这一点(在每次迭代中循环)WHILE
。WAIT 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
?
亲切的问候,托拜厄斯