Lotus Notes应用程序中的代理按照运行的场所可以分为两类,第一类在客户端上运行,第二类在应用程序所在的服务器上运行。测试代理时,前者可以很简单地通过操作、按钮或从Designer里的代理列表触发运行;后者则没有这样方便。具体地,在服务器上运行的代理又可以分为两类:一类,也是最主要的,是定时运行的;另一类则是由客户段代码调用在服务器上运行的(以下简称被调用的代理)。
在测试中要触发这些在服务器上运行的代理,根据情况有几种方法可以选择:
1. 对于定时代理,最易想到的方法就是修改代理的时程设置,改为服务器当前时间的两三分钟后。这个方法比较费神麻烦,如果多测试几次,等待的时间也不少。而且测试完成后还要记得把时程设置恢复原样。
2. 对于被调用的代理,当然也可以和在正式运行时一样,用代码来触发运行。
3. 如果包含代理的数据库所在的服务器开启了HTTP服务,则一个很便捷的方法就是通过Web调用,比如:http://DominoServer/path/test.nsf/agReminder?RunAgent
4. 写通用的代码来调用。既然在实际开发中,有些代理因为某种需要须在服务器上运行并由客户端上运行的代码调用,那么为了测试我们就可以写一段通用的代码来调用所有在服务器上运行的代理。这段代码可以置于一个工具数据库中,本身也以一个代理的形式被调用。运行后开发人员可以选择要测试的代理所在的数据库,然后程序从其中所有的代理里挑出可以在服务器上测试运行的那些,把它们的名称显示在一个列表里供开发人员选择,最后调用被选中的代理在服务器上运行。
运行工具代理
选择应用程序
选择要运行的代理
运行完成
下面就是调用代理运行的代码:
Option Public Option Declare Use "Commons" Sub Initialize Call RunAgentOnServer() End Sub %REM Function RunAgentOnServer Description: Run a selected agent on the server containing the agent. %END REM Public Function RunAgentOnServer() On Error GoTo ErrHandler Dim s As New NotesSession Dim ws As New NotesUIWorkspace Dim dbinfo As Variant 'PROMPT_CHOOSEDATABASE=13 dbinfo=ws.Prompt(13, "Please select the database containing agents.", "Select Database") If IsEmpty(dbinfo) Then Exit Function Dim db As NotesDatabase Set db=s.GetDatabase(dbinfo(0), dbinfo(1)) If Not db.IsOpen Then Print "Database " & dbinfo(2) & " cannot be opened." Exit Function End If Dim agents() As String, i As Integer, agName As String 'only show the scheduled agents i=0 ForAll ag In db.Agents 'sometimes manual agents need to be run on server 'If Not ag.ServerName="" Then 'End If Select Case ag.Target Case TARGET_ALL_DOCS_IN_VIEW, TARGET_SELECTED_DOCS, TARGET_UNREAD_DOCS_IN_VIEW Case Else ReDim Preserve agents(i) agName=ag.Name If ag.Trigger=TRIGGER_SCHEDULED Then agName="(Scheduled) " & agName End If agents(i)=agName i=i+1 End Select End ForAll Dim agentInfo As Variant agentInfo=ws.Prompt(PROMPT_OKCANCELLIST, "Select Agent", "Please select the agent to run on server.", "", agents) If IsEmpty(agentInfo) Then Exit Function Dim agent As NotesAgent Set agent=db.GetAgent(agentInfo) Call agent.RunOnServer() Print "Agent " & agentInfo & " ran successfully." Exit Function ErrHandler: MsgBox GetErrorMsg() Exit Function End Function
5. 保存后运行。最后说的这个方法是基于Domino服务器对定时代理的一个规则:每当一个定时代理被新建或修改后,Domino为了防止当前时间已超过代理时程所预定的第一次运行时间从而错过了一次运行,执行一次代理。因此实际上,服务器上数据库里的某个定时代理在被修改后,无论是直接地还是籍替换设计,很快都会被运行一次。所以如果要测试某个代理,只需变动一下代码再保存就可以。但是这个特性往往会导致代理不必要的运行,所以IBM从R7新增了一个Notes.ini参数:Amgr_SkipPriorDailyScheduledRuns,只要将它设置为1,定时代理在保存后就不会立即执行。这样一来,“保存后运行”这个测试方法就无效了,还是根据情况选择前面四种方法之一合宜。