我正在研究一段新的代码,以帮助其他程序员进行应用程序服务器调用。 以前,我们只有一个 .i 文件,并依靠开发人员来确保您进行了所有正确的调用,并在程序结束时清理了应用服务器连接。 显然,有些人过去忘记了这样做,这给我们带来了问题。
我一直在构建一个基本的appserver.cls文件,但是我不知道如何在程序结束时使其断开连接。
到目前为止,我已经尝试了以下方法。
ON CLOSE OF THIS-PROCEDURE
DO:
clAppServer:cleanupAppServer().
END.
这似乎不会在网络速度调用结束时触发。
DESTRUCTOR appserver():
cleanupAppServer().
END DESTRUCTOR.
这在执行垃圾收集时有效,但是 Progress 似乎在 webspeed 调用结束时不会进行垃圾收集,并且对象仍在内存中(这是我需要处理的完全不同的问题(。
ON CLOSE OF SESSION:LAST-PROCEDURE
DO:
clAppServer:cleanupAppServer().
END.
这甚至没有明显编译。
我已经尝试了一大堆其他东西,它们是这三个的变体,但无济于事。
有什么办法可以做到我要求的事情吗? 如果它可以在appserver.cls文件中,则奖励积分。
如果我理解这个问题,您希望在工作完成后断开与另一个应用程序服务器的连接。会尝试以下工作吗?
-
创建应用服务器句柄包装类。此类负责 A/S 连接;它有一个公共的"句柄"(或类似名称的(属性,可用于在应用服务器上运行内容。
-
在此类的析构函数中,您可以添加执行清理的代码:断开连接并删除服务器句柄。
-
想要在应用程序服务器上运行某些内容的代码执行类似...
def var asConn as AppServerConnection.
asConn = new AppServerConnection((。
在asConn:Handle上运行foo.p (param1, out param2(.
原因 GC asConn = ?.
手动销毁 删除对象为连接。
然后,析构函数将执行正确的操作。
请注意,如果在内部过程或方法中有此代码,则变量将在其末尾超出范围,并且 GC 将启动。
在 https://github.com/consultingwerk/ADE-Sourcecode/blob/566ac0a6e085d6305a8f364f13a1d805d3597d2a/src/netlib/OpenEdge/Net/ServerConnection/ClientSocket.cls
请记住,在 ClientSocket 中,句柄是私有的 - 您可能希望将其设置为常规 AppServer 连接的公共句柄。