关于opengge:如何让代码在程序结束时执行?

How do you get code to execute at the end of a procedure?

我正在编写一段新代码,以帮助其他程序员进行应用服务器调用。以前我们只有一个 .i 文件,并依靠开发人员确保您进行了所有正确的调用并在程序结束时清理了应用服务器连接。显然有些人过去忘记了这样做,这给我们带来了问题。

我一直在构建一个基本的 appserver.cls 文件,但我不知道如何让它在程序结束时断开连接。

到目前为止,我已经尝试了以下方法。

1
2
3
4
ON CLOSE OF THIS-PROCEDURE  
DO:    
    clAppServer:cleanupAppServer().
END.

这似乎不会在 webspeed 调用结束时触发。

1
2
3
DESTRUCTOR appserver():
    cleanupAppServer().
END DESTRUCTOR.

这在进行垃圾收集时有效,但 Progress 似乎在 webspeed 调用结束时并没有进行垃圾收集,并且对象仍在内存中(这是一个完全不同的问题,我需要处理) .

1
2
3
4
ON CLOSE OF SESSION:LAST-PROCEDURE  
DO:    
    clAppServer:cleanupAppServer().
END.

这显然无法编译。

我已经尝试了一大堆其他的东西,这些东西都是这三个的变体,但都无济于事。

有什么方法可以做到我的要求吗?如果它可以在 appserver.cls 文件中,则加分。


如果我理解这个问题,您希望在工作完成后与另一个 AppServer 断开连接。会尝试以下工作的方式吗?

  • 创建一个 AppServer-handle-wrapper 类。该类负责A/S连接;它有一个公共的"Handle"(或类似名称)属性,您可以使用它在 AppServer 上运行东西。

  • 在此类的析构函数中,您可以添加代码来进行清理:断开连接并删除服务器句柄。

  • 想要在 AppServer 上运行的代码会执行类似 ...

    def var asConn as AppServerConnection.

    asConn = new AppServerConnection().

    在 asConn:Handle (param1, out param2) 上运行 foo.p。

    // 导致 GC
    asConn = ?.

    //手动销毁
    删除对象 asConn.

然后析构函数会做正确的事。

请注意,如果您在内部过程或方法中有此代码,则变量将在其末尾超出范围,GC 将启动。

在 https://github.com/consultingwerk/ADE-Sourcecode/blob/566ac0a6e085d6305a8f364f13a1d805d3597d2a/src/netlib/OpenEdge/Net/ServerConnection/ClientSocket.cls 上有一个这种方法的例子

请记住,在 ClientSocket 中,句柄是私有的 - 您可能希望将其公开以用于一般的 AppServer 连接。