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

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 806
21
#1
Всем привет!
Сталкивался ли кто с вопросом динамического создания/удаления агентов?
Как решался вопрос?
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
КМК, создавать можно через DXL, удалять — через NotesNoteCollection.
Также есть вариант не создавать/удалять агента, а в агенте вызывать Execute, код сохранять в документе, ноту документа передавать агенту, агент после вызова удалял бы документ.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 806
21
#3
КМК, создавать можно через DXL, удалять — через NotesNoteCollection.
Также есть вариант не создавать/удалять агента, а в агенте вызывать Execute, код сохранять в документе, ноту документа передавать агенту, агент после вызова удалял бы документ.
С порядком выполнения и сохранения кода вопросов нет.
Дело в том что хотелось бы создавать агент и менять время запуска.
Через DXL пробовал... но ничего не получилось. Что делал:
-по юниду взял агента;
-экспортировал в xml;
-удалил агент;
-импортировал из xml;
Результат 0. Ошибок экспорта/импорта нет. Все отрабатывает нормально
 

nvyush

Lotus team
22.04.2009
2 317
0
#4
Дело в том что хотелось бы создавать агент и менять время запуска.
Может это следует разнести? Один агент "живёт" постоянно, а агент по расписанию, пускающий первый, настраивается динамически. Такой подход применяют, когда в агенте используется включаемая библиотека, недоступная заказчику (при изменении расписания он не перекомпилируется).
Помнится, ToxaRat боролся с чем-то подобным, может через личку подскажет?
 
13.03.2009
625
1
#5
Через DXL пробовал... но ничего не получилось. Что делал:
-по юниду взял агента;
-экспортировал в xml;
-удалил агент;
-импортировал из xml;
Результат 0. Ошибок экспорта/импорта нет. Все отрабатывает нормально
походу забыли doc.sign после импорта...
 
13.03.2009
625
1
#7
Ну так чтоб посигнить док - его надо получить. А по последнему импортированному документу ничего не возвращается
Откуда не возвращается? В чем проблема найти ноту, если вы ее только что сами импортировали? Или импорт не срабатывает и агент не появляется?
Код покажете, или будем играть в угадайку?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 806
21
#8
Откуда не возвращается? В чем проблема найти ноту, если вы ее только что сами импортировали? Или импорт не срабатывает и агент не появляется?
Код покажете, или будем играть в угадайку?
Агент не импортируется.
Импорт якобы происходит.. но в результате ничего не импортируется.
Код - обычные примеры из хелпа.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 806
21
#9
Вот в нете нашел это
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
 
13.03.2009
625
1
#10
Агент не импортируется.
Импорт якобы происходит.. но в результате ничего не импортируется.
Код показать не хотите? Тогда продолжим читать мысли чужой код на расстоянии:
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">
Код:
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
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 806
21
#11
Откуда не возвращается? В чем проблема найти ноту, если вы ее только что сами импортировали? Или импорт не срабатывает и агент не появляется?
Код покажете, или будем играть в угадайку?
Код:
		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
 
13.03.2009
625
1
#14
1. В целях совместимости, имеет смысл убрать из xml все специфичное 8.5.2: удалить DOCTYPE, agent/@version, agent/@designerversion.

2. Могу ошибаться, но чой-то не нашел в схеме /agent/schedule/@runlocation значение "specific". Допустимые значения: local, any, choose, server
domino_8_5_M2.dtd сказал(а):
<!-- Specifies the host system on which a scheduled operation runs. -->

<!-- Choices:
local: The local system
any: Any server system
choose: Choose when agent is enabled
server: A specific server specified by the runserver attribute
-->

<!ENTITY % schedule.runlocations "
local |
any |
choose |
server
">
 

Omh

Lotus team
04.07.2007
2 210
1
#18
15:08:2011, 11:48 - а что же не получилось?; )
28:11:2011, 20:39 - Все получилось

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

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 806
21
#19
15:08:2011, 11:48 - а что же не получилось?; )
28:11:2011, 20:39 - Все получилось

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

nvyush

Lotus team
22.04.2009
2 317
0
#20
В нете нашел пример с использованием API, который позволяет редактировать атрибуты, но под Windows. Вот думаю переписать код под Unix, но пока нет времени
Выложили бы тут код/ссылку, может кто поспособствовал :rolleyes: . Всё-таки задача востребованная.