【问题标题】:OpenEdge AppServer timeoutOpenEdge AppServer 超时
【发布时间】:2020-09-15 18:38:37
【问题描述】:

我正在使用普通的旧 OpenEdge AppServer(不是 PAS)11.7,使用为 C# 生成的代理 dll(开放客户端的代理生成器)。

除了设置连接超时之外,这非常有效。 如果我使用该代理调用一个函数,我想设置一个超时以便调用失败(例如通过抛出异常)

我已尝试关注 Progress.Open4GL.RunTimeProperties

RunTimeProperties.ConnectionTimeout
无证。不做顾名思义

RunTimeProperties.SocketTimeout = 8000;
没有记录。默认值为 0。值很可能是毫秒
与此设置更接近。如果被调用函数的执行时间超过这个 值 Progress.Open4GL.Exceptions.Open4GLException 被抛出

但是:它只在调用函数返回时抛出,因此它毫无用处。 通过在要调用的函数中添加“PAUSE 100”来轻松测试。 100 秒后抛出异常(而不是 8 秒后)

如何实现函数调用超时?

【问题讨论】:

    标签: c# openedge appserver


    【解决方案1】:

    有点……

    您可以为应用服务器调用设置全局超时。但不是函数超时。

    根据https://knowledgebase.progress.com/articles/Article/P174143

    OpenEdge 10.2B 中引入了两个新功能以实现 这个目标,无论是在程序块级别还是在应用程序 服务器级别。

    在程序块级别:

    第一种限制过程调用时间的方法是使用 STOP-AFTER 短语。此短语指定 DO 的超时值, FOR 或 REPEAT 块。指定数字的整数表达式 块的每次迭代有几秒钟,直到发生超时。如果一个 发生超时,AVM 引发 STOP 条件。

    在应用服务器级别:

    另一种限制过程调用执行时间的方法是设置 全局 [UBroker] 中名为 srvrExecutionTimeLimit 的属性或 ubroker.properties 的特定 [UBroker.] 部分 文件。这是一个非负整数属性,它指定 远程过程可以在 给定 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.
    

    因此,根据您的应用服务器代码实际执行的操作,这可能有帮助,也可能没有帮助。

    【讨论】:

    • 感谢您的回答,但这并不能解决问题。 Ubroker srvrExecutionTimeLimit 限制调用,但仅在函数完成后。与 RunTimeProperties.SocketTimeout 描述的行为相同
    • 也许您应该在应用服务器端的代码中添加 STOP-AFTER?还是您需要第 3 方组件超时的问题?如果您需要在 3rd 方组件中超时,Progress bist 将无济于事。文档特别指出。
    • 我正在使用 C# 和由 "Proxy Generator for Open Clients" 生成的客户端代理。没有直接调用进度代码。甚至通过例如包围每个功能DO STOP-AFTER 10... 仅在执行完成后应用
    • 难道没有一个普通的旧 Progress 应用服务器运行 Progress 4gl 代码吗?我的印象是您试图使在您从 C# 客户端调用(通过代理)的普通旧应用服务器上运行的 4gl 代码超时。我误会了吗?
    • 无 C# --> ProgressProxyFor.Net --> AppServer --> 进度代码
      ProgressProxyFor.Net 需要被告知在 x 秒后停止。
      尝试 DO STOP- 5 后:暂停 10. 显示“bla”。结尾。它等待 10 秒,但不显示“bla”,因此 stop-after 非常没用
    猜你喜欢
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2013-09-28
    • 2018-12-30
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多