Как вы получаете код для выполнения в конце процедуры? - PullRequest
0 голосов
/ 13 января 2020

Я работаю над новым фрагментом кода на работе, чтобы помочь остальным программистам выполнять вызовы сервера приложений. Ранее у нас был только файл .i, и мы полагались на разработчика, чтобы убедиться, что вы сделали все правильные вызовы и очистили соединение с сервером приложений в конце программы. Очевидно, что некоторые люди забыли сделать это в прошлом, и это создало для нас проблемы.

Я собираю файл appiver.cls basi c, но не могу понять, как заставить его отключиться в конце программы.


До сих пор я пробовал следующие вещи:

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.

1 Ответ

3 голосов
/ 13 января 2020

Если я понимаю вопрос, вы хотите отключиться от другого AppServer после завершения работы. Попробуете что-нибудь в соответствии с приведенной ниже работой?

  • Создать класс AppServer-handle-wrapper. Этот класс отвечает за соединение A / S; у него есть свойство publi c «Handle» (или с аналогичным именем), которое можно использовать для запуска содержимого на AppServer.

  • В деструкторе этого класса вы можете добавить код, который выполняет очистку: отключает и удаляет дескриптор сервера.

  • Код, который хочет что-то запустить на AppServer, выполняет что-то вроде ...

    def var asConn как AppServerConnection .

    asConn = new AppServerConnection ().

    запустить foo.p для asConn: дескриптор (param1, out param2).

    // вызвать G C asConn = ?.

    // уничтожить вручную удалить объект asConn.

Деструктор сделает все правильно.

Обратите внимание, что если у вас есть этот код во внутренней процедуре или методе переменная go выходит из области видимости в конце, и G C включается.

Пример такого подхода в https://github.com/consultingwerk/ADE-Sourcecode/blob/566ac0a6e085d6305a8f364f13a1d805d3597d2a/src/netlib/OpenEdge/Net/ServerConnection/ClientSocket.cls

Имейте в виду, что в ClientSocket дескриптор является частным - вы можете захотеть чтобы сделать его общедоступным c для обычного соединения с AppServer.

...