XPages & InMemory-Agents

Mit InMemory-Agents lassen sich Agenten wunderbar in XPage-Applikationen integrieren. Die XPage wartet, bis der Agent durchgelaufen ist, und über den Documentcontext kann eine bidirektionale Kommunikation zwischen den beiden  stattfinden. Ohne irgendwelche mehr oder minder dubiose Workarounds für das Zwischenspeichern von Werten (z.B. Speichern des Dokumentes, Arbeiten mit Profildokumenten, usw.) können auf diesem Weise bestehende LotusScript-Agenten in eine XPage integriert werden:

Hier ein kleines Beispiel mit einem Button, der einen Agent startet, und dessen Ergebnis auswertet :

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
   <xp:button value="Label" id="button1">
       <xp:eventHandler event="onclick" submit="true"
       refreshMode="complete">
         <xp:this.action><![CDATA[#{javascript:
            var document = database.createDocument();
            var agent = database.getAgent("InMemoryAgent");
            agent.runWithDocumentContext( document );
            print( document.getItemValueString("InMemReturn") );
            }]]>
         </xp:this.action>
      </xp:eventHandler>
   </xp:button>
</xp:view>

[In Rot: Der Aufruf des Agenten. Der Code nach dem Aufruf wird erst nach Laufen des Agenten ausgeführt ]

Der LotusScript-Agent für dieses Beispiel schreibt den aktuellen Zeitstempel in das übergebene Dokument:

Option Public
Option Declare

Sub Initialize
 Dim session As New NotesSession
 Dim doc As NotesDocument

 Set doc = session.Documentcontext
 doc.Appenditemvalue "InMemReturn", CStr(Now)

End Sub

Der print-Befehl in der obigen XPage wird erst nach der Verarbeitung des Agenten ausgeführt; auf der Serverkonsole wird der aktuelle Datumsstring ausgegeben.

Natürlich kann es sich auch um einen Java-Agenten handeln, doch für beide gilt, daß der Haken „Run as Web user“ aktiviert sein muß:

Ist der Haken nicht aktiviert, erhält man ansonsten eine im ersten Moment nichtssagende Fehlermeldung serviert:

Exception occured calling
NotesAgent.runWithDocumentContext (lotus.domino.local.Document) null

Die Meldung verwirrt im ersten Moment, und es ist das erste Mal, daß sich im Stack Trace eine wirklich aussagekräftige Information wiederfindet (man muß etwas suchen, hier stark verkürzt):

(…)
com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:304)
com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:261)
com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:291)
NotesException: Unable to pass doc context – Inner agent must run as webuser
lotus.domino.local.Agent.runWithDocumentContext(Unknown Source)
com.ibm.xsp.script.DominoHelper$5.run(DominoHelper.java:154)
(…)

[In Fett: Die erste aussagekräftige Stack Trace-Meldung. Es geht doch, liebe IBM!]

Dieser Beitrag wurde unter Agenten, Allgemein, Lotus Script, XPages abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.