54. 如何在测试中触发服务器上运行的代理

来源:互联网 发布:网页版淘宝旺旺无法 编辑:程序博客网 时间:2024/05/20 23:40
Lotus Notes应用程序中的代理按照运行的场所可以分为两类,第一类在客户端上运行,第二类在应用程序所在的服务器上运行。测试代理时,前者可以很简单地通过操作、按钮或从Designer里的代理列表触发运行;后者则没有这样方便。具体地,在服务器上运行的代理又可以分为两类:一类,也是最主要的,是定时运行的;另一类则是由客户段代码调用在服务器上运行的(以下简称被调用的代理)。

在测试中要触发这些在服务器上运行的代理,根据情况有几种方法可以选择:

1.      对于定时代理,最易想到的方法就是修改代理的时程设置,改为服务器当前时间的两三分钟后。这个方法比较费神麻烦,如果多测试几次,等待的时间也不少。而且测试完成后还要记得把时程设置恢复原样。

2.      对于被调用的代理,当然也可以和在正式运行时一样,用代码来触发运行。

3.      如果包含代理的数据库所在的服务器开启了HTTP服务,则一个很便捷的方法就是通过Web调用,比如:http://DominoServer/path/test.nsf/agReminder?OpenAgent

4.      写通用的代码来调用。既然在实际开发中,有些代理因为某种需要须在服务器上运行并由客户端上运行的代码调用,那么为了测试我们就可以写一段通用的代码来调用所有在服务器上运行的代理。这段代码可以置于一个工具数据库中,本身也以一个代理的形式被调用。运行后开发人员可以选择要测试的代理所在的数据库,然后程序从其中所有的代理里挑出可以在服务器上测试运行的那些,把它们的名称显示在一个列表里供开发人员选择,最后调用被选中的代理在服务器上运行。


运行工具代理


选择应用程序


选择要运行的代理


运行完成

下面就是调用代理运行的代码:

Option PublicOption DeclareUse "Commons"Sub InitializeCall RunAgentOnServer()End Sub%REMFunction RunAgentOnServerDescription: Run a selected agent on the server containing the agent.%END REM'Run a selected agent on the server containing the agent.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     i=0    ForAll ag In db.Agents        Select Case ag.Target            Case TARGET_ALL_DOCS_IN_VIEW, TARGET_SELECTED_DOCS, TARGET_UNREAD_DOCS_IN_VIEW            Case Else                  ReDim Preserve agents(i)                'ag.Name: name | alias                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 sortedAgents As Variant    sortedAgents=QuickSort(agents)    Dim agentName As Variant    agentName=ws.Prompt(PROMPT_OKCANCELLIST, "Select Agent", "Please select the agent to run on server.", "", sortedAgents)    If IsEmpty(agentName) Then Exit Function    'Get the agent last alias    agentName=Split(agentName, "|")    agentName=agentName(UBound(agentName))    agentName=Trim(agentName)    Dim agent As NotesAgent    Set agent=db.GetAgent(agentName)    Call agent.RunOnServer()    Print "Agent " & agentName & " ran successfully."    Exit FunctionErrHandler:    MsgBox GetErrorMsg()    Exit FunctionEnd Function
5.      保存后运行。最后说的这个方法是基于Domino服务器对定时代理的一个规则:每当一个定时代理被新建或修改后,Domino为了防止当前时间已超过代理时程所预定的第一次运行时间从而错过了一次运行,执行一次代理。因此实际上,服务器上数据库里的某个定时代理在被修改后,无论是直接地还是籍替换设计,很快都会被运行一次。所以如果要测试某个代理,只需变动一下代码再保存就可以。但是这个特性往往会导致代理不必要的运行,所以IBM从R7新增了一个Notes.ini参数:Amgr_SkipPriorDailyScheduledRuns,只要将它设置为1,定时代理在保存后就不会立即执行。这样一来,“保存后运行”这个测试方法就无效了,还是根据情况选择前面四种方法之一合宜。