如何从Domino服务器DS1的agent1调用DS2的agent2并传递参数
跨Domino服务器调用代理并传递参数的解决方案
问题分析
你当前的代码无法跨服务器调用agent2,核心原因是runWithDocumentContext仅支持在本地服务器执行代理,不能触发远程服务器上的代理运行;同时未保存的临时文档也无法被远程代理正确读取。
修正方案
通过创建并保存参数文档+RunOnServer方法实现跨服务器代理调用,具体代码和步骤如下:
1. 修改agent1代码(DS1上)
Dim ses As New NotesSession Dim db2 As NotesDatabase Dim agent2 As NotesAgent Dim docTemp As NotesDocument Dim serverName As String Dim mailFile As String ' 获取外部应用传入的参数 serverName = ses.GetEnvironmentString("mailserver", True) mailFile = ses.GetEnvironmentString("mailfilename", True) ' 连接目标服务器的delete-database.nsf Set db2 = New NotesDatabase(serverName, "delete-database.nsf") If Not db2.IsOpen Then Call db2.Open("", "") End If ' 创建并保存参数文档(必须保存才能被远程代理读取) Set docTemp = New NotesDocument(db2) docTemp.Form = "TempParam" ' 可创建专用表单标记临时参数文档 docTemp.mailfilename = mailFile Call docTemp.Save(True, False) ' 触发目标服务器上的agent2 Set agent2 = db2.GetAgent("agent2") If Not agent2 Is Nothing Then ' 传递参数文档的NoteID,让agent2通过ID读取参数 Call agent2.RunOnServer(docTemp.NoteID) End If
2. 修改agent2代码(DS2上)
Dim ses As New NotesSession Dim db As NotesDatabase Dim docTemp As NotesDocument Dim mailfilename As String Dim noteID As String Set db = ses.CurrentDatabase ' 获取agent1传递的参数文档NoteID noteID = ses.ParameterDocID If noteID <> "" Then Set docTemp = db.GetDocumentByID(noteID) If Not docTemp Is Nothing Then mailfilename = docTemp.mailfilename(0) ' --- 执行邮件数据库删除逻辑 --- Dim mailDB As NotesDatabase Set mailDB = New NotesDatabase("", mailfilename) If mailDB.IsOpen Then Call mailDB.Remove End If ' --- 删除逻辑结束 --- ' 可选:删除临时参数文档,避免冗余数据 Call docTemp.Remove(True) End If End If
关键注意事项
- 权限配置:确保DS1上的代理运行账号拥有DS2上
delete-database.nsf的创建文档权限、DS2上的代理运行权限,以及删除目标邮件数据库的权限。 - 文档必须保存:参数文档必须执行
Save操作,否则远程代理无法读取到参数内容。 - 正确触发方法:
RunOnServer是跨Domino服务器触发代理的唯一有效方法,run/runWithDocumentContext仅支持本地服务器执行。 - 参数传递可靠性:通过
NoteID传递参数文档能避免服务器复制延迟带来的文档查找问题,是最稳妥的跨服务器参数传递方式。
内容的提问来源于stack exchange,提问作者Baku Bakar
相关产品推荐
相关产品推荐

