Динамическое создание/удаление агентов

Тема в разделе "Lotus - Программирование", создана пользователем NickProstoNick, 10 авг 2011.

  1. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    Сталкивался ли кто с вопросом динамического создания/удаления агентов?
    Как решался вопрос?
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    КМК, создавать можно через DXL, удалять — через NotesNoteCollection.
    Также есть вариант не создавать/удалять агента, а в агенте вызывать Execute, код сохранять в документе, ноту документа передавать агенту, агент после вызова удалял бы документ.
     
  3. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    С порядком выполнения и сохранения кода вопросов нет.
    Дело в том что хотелось бы создавать агент и менять время запуска.
    Через DXL пробовал... но ничего не получилось. Что делал:
    -по юниду взял агента;
    -экспортировал в xml;
    -удалил агент;
    -импортировал из xml;
    Результат 0. Ошибок экспорта/импорта нет. Все отрабатывает нормально
     
  4. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Может это следует разнести? Один агент "живёт" постоянно, а агент по расписанию, пускающий первый, настраивается динамически. Такой подход применяют, когда в агенте используется включаемая библиотека, недоступная заказчику (при изменении расписания он не перекомпилируется).
    Помнится, ToxaRat боролся с чем-то подобным, может через личку подскажет?
     
  5. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    походу забыли doc.sign после импорта...
     
  6. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну так чтоб посигнить док - его надо получить. А по последнему импортированному документу ничего не возвращается
     
  7. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Откуда не возвращается? В чем проблема найти ноту, если вы ее только что сами импортировали? Или импорт не срабатывает и агент не появляется?
    Код покажете, или будем играть в угадайку?
     
  8. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Агент не импортируется.
    Импорт якобы происходит.. но в результате ничего не импортируется.
    Код - обычные примеры из хелпа.
     
  9. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Вот в нете нашел это
    Код (C++):
    import lotus.domino.*;
    public class JavaAgent extends AgentBase {
    public void NotesMain() {
    try {
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();
    DxlFactory.createAgent("James Bond", DxlAgent.LOTUSSCRIPT).addCodeEvent("Initialize", "Sub Initialize\n'Shaken, not stirred.\nEnd Sub").toDesignElement(agentContext.getCurrentDatabase());
    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
    Но не совсем понятно DxlFactory
     
  10. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Код показать не хотите? Тогда продолжим читать мысли чужой код на расстоянии:
    DesignImportOption не забыли? Импортер по дефолту игнорит элементы дизайна...

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">создаем (неподписанную) копию первого попавшегося агента </div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Set db = session.CurrentDatabase

    Dim agentNote As NotesDocument
    Set agentNote = getFirstAgent( db )

    Call setAgentName( agentNote , "Copy of " + getAgentName(agentNote) )

    Dim exporter As NotesDXLExporter, importer As NotesDXLImporter
    Set exporter = session.CreateDXLExporter( agentNote )
    Set importer = session.CreateDXLImporter(exporter, db)
    importer.DesignImportOption = DXLIMPORTOPTION_CREATE
    Call exporter.process

    Print " agent created: " & getAgentName(agentNote)
    End Sub

    Private Function getFirstAgent(db As NotesDatabase) As NotesDocument
    Dim nc As NotesNoteCollection
    Set nc = db.CreateNoteCollection( False )
    nc.SelectAgents = True
    Call nc.BuildCollection
    Set getFirstAgent = db.GetDocumentByID( nc.GetFirstNoteId )
    End Function

    Private Function getAgentName( agentNote As NotesDocument ) As String
    getAgentName = agentNote.getItemValue("$Title")(0)
    End Function

    Private Sub setAgentName( agentNote As NotesDocument , title As String )
    Call agentNote.ReplaceItemValue( "$Title" , title )
    End Sub
     
  11. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Код (LotusScript):
            Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim docAgent As NotesDocument
    Dim importer As NotesDXLImporter
    Dim dxl As String


    On Error Resume Next

    dxl = |<?xml version='1.0'?>
    <!DOCTYPE agent SYSTEM 'xmlschemas/domino_8_5_2.dtd'>
    <agent name='tmplAgent' xmlns='http://www.lotus.com/dxl' version='8.5' maintenanceversion='2.0'
    replicaid='0123456789ABCDEF' hide='v3' publicaccess='false' designerversion='8.5.2'
    activatable='false'>
    <trigger type='scheduled'>
    <schedule type='byminutes' hours='1' minutes='0' runlocation='specific' /></trigger>
    <documentset type='modified'/><code event='options'><lotusscript>
    Option Public
    Option Declare

    </lotusscript></code><code event='initialize'><lotusscript>Sub Initialize
    MessageBox "TEST!!!!!"
    End Sub</lotusscript></code>
    <rundata processeddocs='0' exitcode='0'>
    </rundata></agent>
    |


    '** create a new doc using the DXL above
    Set db = session.CurrentDatabase
    'Set importer = session.CreateDXLImporter(dxl, db)
    Set importer = session.CreateDXLImporter
    importer.ReplicaRequiredForReplaceOrUpdate = False
    importer.DocumentImportOption = DXLIMPORTOPTION_CREATE
    Call importer.Import(dxl, db)
    'Call importer.Process
    Set docAgent = db.GetDocumentByID(importer.GetFirstImportedNoteId)
    '** get the button from the doc we just created and append it to
    '** the rich text item we were given
    '       Call Db.Sign( DBSIGN_DOC_DATA, False, importer.GetFirstImportedNoteId, True )      

    'Call docAgent.Save(True, False, True)

    MessageBox importer.Log
     
  12. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    turumbay выше уже писал
    не хватает
    Код (LotusScript):
    importer.DesignImportOption = DXLIMPORTOPTION_CREATE
     
  13. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Забыли DesignImportOption. Не путать с DocumentImportOption
     
  14. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    1. В целях совместимости, имеет смысл убрать из xml все специфичное 8.5.2: удалить DOCTYPE, agent/@version, agent/@designerversion.

    2. Могу ошибаться, но чой-то не нашел в схеме /agent/schedule/@runlocation значение "specific". Допустимые значения: local, any, choose, server
     
  15. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем огромное спасибо!
    Почти все получилось
     
  16. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    а что же не получилось?; )
     
  17. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Все получилось
     
  18. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    15:08:2011, 11:48 - а что же не получилось?; )
    28:11:2011, 20:39 - Все получилось

    Путь оказался тернист :)
     
  19. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну просто я задал вопрос... а потом понял что вопрос глупый :rolleyes: а удалить пост уже не мог... вот и пришлось переписать сообщение :)
    А что не получилось... не получилось красиво решить вопрос по установке атрибутов запуска агента.... по этому сейчас приходится удалять агент и создавать новый.
    В нете нашел пример с использованием API, который позволяет редактировать атрибуты, но под Windows. Вот думаю переписать код под Unix, но пока нет времени
     
  20. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Выложили бы тут код/ссылку, может кто поспособствовал :rolleyes: . Всё-таки задача востребованная.
     
Загрузка...

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