0

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

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


到目前为止,我已经尝试过以下事情。

ON CLOSE OF THIS-PROCEDURE  
DO:    
    clAppServer:cleanupAppServer(). 
END.

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

DESTRUCTOR appserver():
    cleanupAppServer().
END DESTRUCTOR.

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

ON CLOSE OF SESSION:LAST-PROCEDURE  
DO:    
    clAppServer:cleanupAppServer(). 
END.

这甚至没有明显编译。

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


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

4

1 回答 1

3

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

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

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

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

    def var asConn 作为 AppServerConnection。

    asConn = 新的 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 连接。

于 2020-01-13T17:36:19.793 回答