Schedulera en agent med Lotusscript och DXL
Det finns inga metoder i agentklassen i Lotusscript för att schedulera en agent programmatiskt. Jag har istället gjort ett script som sätter en agents scheduleringsegenskaper med hjälp av DXL.
Scriptet tar vilken agent som helst och gör om den till en schedulerad agent med de egenskaper som du sätter, tex med vilket intervall du vill att den ska köras.
Här är ett snabbt flöde på vad som görs i koden nedan.
- Specificera vilken agent du vill processa
- Hämta agenten och lägg den i en notesnotecollection
- Exportera agenten som XML (DXL)
- Tala om Lotusscript att vi vill processa xmlkoden enligt DOM
- Vänta till processen att använda DOM är klar
- Ändra eller skapa de noder i xmlträdet som styr scheduleringen
- Importera den förändrade XML/DXL koden för agenten till databasen igen (via s.k. pipelining)
- Signera och spara agenten.
Lägg scriptet nedan i en agent, ange ett agentnamn och kör agenten. Angiven agent blir då satt som schedulerad oavsett om den var det tidigare eller inte. jag har bara testat denna kod i R7.
Declarations
Dim AgentName As String
Dim AgentType As String
Dim AgentHour As String
Dim agentMinute As String
Dim AgentRunOnServer As String
Dim AgentRunOnWeekends As String
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim domparser As notesdomparser
Dim exporter As NotesDXLExporter
Dim importer As notesDXLImporter
Dim doc As notesdocument
Dim nc As NotesNoteCollection
Dim agent As notesagent
AgentName = "Dummy"
AgentType = "byminutes"
AgentHour = "2"
AgentMinute = "10"
AgentRunOnServer = "local"
AgentRunOnWeekends = "true"
Set db = session.CurrentDatabase
Set agent = db.GetAgent(AgentName)
Set nc = db.CreateNoteCollection(False)
Call nc.Add(agent)
Set exporter = session.CreateDXLExporter(nc)
Set domParser = session.CreateDOMParser(exporter)
On Event PostDOMParse From domParser Call ProcessDOM
Set importer = session.CreateDXLImporter(domparser, db)
importer.DesignImportOption = 6
Call exporter.process
Set doc = db.GetDocumentByID(nc.GetFirstNoteId)
Call doc.Sign()
Call doc.save(False,False)
End Sub
Sub ProcessDom(domParser As NotesDOMParser)
Dim rootnodelist As NotesDOMNodeList
Dim agentnodelist As NotesDOMNodeList
Dim triggernode As NotesDOMElementNode
Dim agentnode As NotesDOMElementNode
Dim domdoc As NotesDOMDocumentNode
Dim newnode As notesdomelementnode
Dim newnodelist As notesdomnodelist
Set domDoc = domParser.Document
Set rootnodeList = domDoc.GetElementsByTagName("agent")
For i = 1 To rootnodeList.NumberOfEntries
Set agentNode = rootnodeList.GetItem(i)
If agentnode.GetAttribute("name") = AgentName Then
Set agentnodelist = agentNode.GetElementsByTagName ("trigger")
Set triggernode = agentnodelist.GetItem(1)
Call triggernode.SetAttribute("type","scheduled")
Set newnodelist = triggernode.GetElementsByTagName("schedule")
If newnodelist.NumberOfEntries > 0 Then
Set newNode = newnodelist.GetItem(1)
Else
Set newnode = domdoc.CreateElementNode("schedule")
End If
Call newnode.SetAttribute("type",AgentType)
Call newnode.SetAttribute("hours",AgentHour)
Call newnode.SetAttribute("minutes",AgentMinute)
Call newnode.SetAttribute("runlocation",AgentRunOnServer)
Call newnode.SetAttribute("onweekends",AgentRunOnWeekends)
Call triggernode.appendchild(newnode)
End If
Next
domParser.Serialize
End Sub
Relevanta Poster på Notessidan: