我使用的是普通的老式OpenEdge AppServer (而不是PAS) 11.7,使用的是为C#生成的代理dll (开放客户端代理生成器)。
除了为连接设置超时之外,这个方法工作得很好。如果我使用那个代理调用一个函数,我想设置一个超时,这样调用就会失败(例如抛出一个异常)
我试过关注Progress.Open4GL.RunTimeProperties
RunTimeProperties.ConnectionTimeout
无证可查。并不像它的名字所暗示的那样
RunTimeProperties.SocketTimeout = 8000;
没有文档记录。默认值为0。值最有可能是毫秒
与此设置越来越接近。如果被调用函数的执行时间超过该值,则抛出Progress.Open4GL.Exceptions.Open4GLException
但是:它只在调用函数返回时抛出,因此它是非常无用的。通过将"PAUSE 100“添加到要调用的函数,可以轻松地进行测试。100秒后抛出异常(而不是8秒后)
如何实现函数调用的超时?
发布于 2020-05-28 21:04:38
有点..。
您可以为应用服务器调用设置全局超时。但不是按函数超时的函数。
根据https://knowledgebase.progress.com/articles/Article/P174143的说法
为了实现这一目标,在OpenEdge 10.2B中引入了两个新功能,分别位于过程块级别或应用程序服务器级别。
在程序块级别:
对过程调用进行时间限制的第一种方法是使用STOP-AFTER短语。此短语指定DO、FOR或REPEAT块的超时值。整数表达式,它指定块的每次迭代在发生超时之前的秒数。如果发生超时,AVM将引发停止条件。
在应用程序服务器级别:
限制过程调用执行时间的另一种方法是在全局UBroker或特定UBroker中设置名为srvrExecutionTimeLimit的属性。部分的ubroker.properties文件。这是一个非负整数属性,用于指定远程过程可以在给定AppServer上执行的最长时间(以秒为单位)。此超时值适用于在AppServer上执行的所有远程过程。默认值为零,表示无时间限制。AppServer srvrExecutionTimeLimit属性仅控制远程AppServer上过程的执行时间。客户端和AppServer端点之间的数据传输不考虑过程执行时间。
STOP-AFTER显然不会中断大多数语句。它似乎是在语句之间检查的。请考虑以下几点:
etime( yes ).
repeat stop-after 5 on stop undo, leave:
pause 1.
pause 1.
pause 1.
pause 1.
pause 1.
pause 1.
pause 1.
pause 1.
pause 1.
pause 1.
end.
display etime.
pause.与
etime( yes ).
repeat stop-after 5 on stop undo, leave:
pause 10.
end.
display etime.
pause.与
etime( yes ).
repeat stop-after 5 on stop undo, leave:
pause 1.
end.
display etime.
pause.因此,这取决于你的应用服务器代码实际在做什么,这可能会有帮助,也可能没有帮助。
https://stackoverflow.com/questions/62064845
复制相似问题