Агент Run In Background Client Thread

Тема в разделе "Lotus - Программирование", создана пользователем Dragon108, 11 июл 2012.

  1. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Есть агент, который обрабатывает тучу документов по клику пользователя из представления.
    Эта туча документов растет - поэтому у агента поставили галку - Run in background client thread. Все нормально, все прекрасно, пользователь нажимает на кнопку и может работать дальше, не ожидания конца выполнения агента. Но есть одна проблема - пользователь может прекратить работу данного агента, например, просто закрыв клиента лотуса (естественно, если выполняется бэкграундный агент, его спросят остановить выполнение или нет - естественно он нажмет не думая - "Да"). Так вот, можно ли как то отловить момент принудительной остановки работы данного агента? или может быть у кого-нибудь есть какие-то соображения на этот счет?
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Нельзя

    Добавлено: Даже Terminate не срабатывает при таком способе завершения работы агента.
     
  3. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Пичалька :)
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    а нафига нужно было такое придумать?
    почему не заставить отработать агент на сервере?
     
  5. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Написать dll, в ней запускать поток, в нем вызывать агента. Из Лотуса, соответственно вызывать ф-цию из dll.
     
  6. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    И что получится? Все равное в коде агента не узнаешь что его пытаются остановить
     
  7. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    NickProstoNick, в коде dll узнаете. См. DllMain entry point.
     
  8. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну так на сколько я понял, цель - корректно остановить выполнение агента, а не на "пол пути"...
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Я бы послушал ToxaRat и переделал бы агента для запуска на сервере.
    Не надо усложнять себе жизнь.
    Конечная цель, как я понял, - не дать агенту остановиться, а значит надо запускать его на сервере.
     
  10. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Вопрос-то был:
    А вот если
    - то да, переносить агента на сервер. А пользователю (при желании) можно сделать кнопку в базе для "старта задания".
     
  11. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Перенести на сервер нельзя - по разным причинам. Агент должен отрабатывать на клиенте.
    Вкратце суть: после выполнения агента, в notes.ini клиента проставляется переменная, так вот, если агент остановить принудительно, то естественно это переменная не проставится, что очень плохо :( так вот вопрос и был в том, можно ли как то узнавать о принудительном завершении агента и если агент завершился принудительно, то проставлять эту переменную ...
    Я так понял кроме dll сделать никак нельзя. Так как ни разу так не делал то сразу вопрос или точнее вопросы: Я смогу из dll изменить notes.ini - сам думаю что да. И как это сделать? (как подключить dll и т.д.) Был бы рад ссылки на ресурс.
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну подключить DLL не проблема :(
    Код (LotusScript):
    Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA"
    Проблема распространить ее на клиентские машины... а если вдруг DLL будет модифицироваться... :)
    Геморроя не на много меньше.

    А если сделать так... при старте агента в переменную notes.ini заносить что-то типа "inProcess" ну или что-то... сам реши. По окончанию работы агента заноси то что нужно.
    Ну и например при старте базы проверяй эту переменную... если там "inProcess" - стартуй агент снова
     
  13. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Не проще ли при старте агента записывать в ini переменную-флаг, которую по завершении работы агента сбрасывать. При старте приложения анализируете наличие флага и формируете от имени пользователя письмо в бухгалтерию "Прошу лишить премии за неумение пользоваться кампутиром" :(
     
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    nvy :( мысли однако сходятся...
     
  15. RAJ

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    самое интересное, что успел сделать агент в предыдущей прерванной сессии и как продложить или откатить сделанные измения(ролбека в лотусе то нету) :(
     
  16. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Даже не знаю.... например:
    берем фолдер... набиваем нужными доками...
    По мере обработки доки из фолдера выкидываем...
    Если обработку дока можно разбить на логические блоки - обработку каждого дока логируем...
    Прервалась обработка - при старте проверяем лог... завершаем все что не успели... и т.д.

    Ну как бы такого объема данные лучше на сервере обрабатывать..
     
  17. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Мысль в догонку — если в Queryclose базы данных добавить проверку на наличие флага работы бэкграунд-агента и ставить Continue = False, то базу и, как следствие, клиента нельзя будет закрыть, пока агент не отработает.
     
  18. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    А если пользователь решит снять задачу или убить процесс?
    Думаю это не спасет
     
  19. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Господа, а если вынести запуск агента в отдельное приложение? Т.е., при нажатии на кнопку запускать какой-нить vbs-файл, который через COM стартанет агента? Вопрос тока в одном - как отреагирует COM на закрытие, например, лотусового клиента?...
     
  20. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Надо тему переименовать в "100 способов получения геморроя на ровном месте". :(
     
Загрузка...

Поделиться этой страницей