个把月前,遇到一个奇异的Alarm设置不生效问题,一直没有时间进行root cause研究。上周,花了2天的时间,自以为寻得答案。此类故障难得一见,罗列出来与之分享。
【背景】
某用户特别爱好Lotus Notes中的Alarm功能,几乎每一个日历文档都设置了Notify。设置Notify的过程若由该用户本身进行操作设置,一切正常。但是若由其助理或秘书通过邮箱 delegation 方式进行设置时,其中部分正常,部分则不工作。该故障现象,呈不规律时间间隔反复出现。
【诊断】
起初,对此故障不以为然。获得用户的ID文件,在自己的客户端上配置一个场所文档,创建了几个测试文档,设置Alarm操作;同时检查用户邮箱的preferences中关于 Follow Up的设置,验证结果显示一切正常。
大约过了两周,该用户再次报障说Alarm不工作。检查用户邮箱数据库中的Calendar Profile文档中与Alarm功能相关的配置项,未发现异常之处;但为保险起见,仍然将其删除后重建。同时,重新创建了Location Document。还删除了($Alarms)目录,重建;逐一检查每一条该Folder中的文档,均是正常的。沿用之前的方式,在自己的客户端使用用户的ID文件,监控Alarm文档的执行多日,仍是一切正常。
还是,二周左右,类似的故障再次出现。在LPS的指导下,设置了诊断参数。在用户客户端的Notes.ini文件中加入了诊断参数:
AlarmDebug=1
AlarmCheckFrequency=1
Debug_InitTerm=1
Console_Log_Enabled=1
第一个参数,启用了将Alarm Daemon的运行结果输出;
第二个参数,设置了Alarm Daemon的执行间隔,缺省为10分钟;
第三个参数,将Notes调用相关进程时的启动和退出的时点记录;
最后一个参数,将上述的诊断信息输出到 IBM_TECHNICAL_SUPPORT 目录下的console.log文件中。
【分析】
在获得用户的诊断日志文件之后,发现其中存在大量的如下日志输出:
06/06/2010 08:17:07.28 PM [1600:0011-12E8:alarm] ExtractCurrentAlarm...> Invalid Alarm = 06/04/2010 09:25:00 AM, gAlarmLastSentTime = 06/04/2010 01:55:00 PM
06/06/2010 08:17:07.28 PM [1600:0011-12E8:alarm] ExtractCurrentAlarm...> AlarmTime = 06/04/2010 01:55:00 PM, tmEventTime = 06/04/2010 02:00:00 PM
06/06/2010 08:17:07.28 PM [1600:0011-12E8:alarm] ExtractCurrentAlarm...> Invalid Alarm = 06/04/2010 01:55:00 PM, gAlarmLastSentTime = 06/04/2010 01:55:00 PM
其中标识为 Invalid Alarm 的时间值,为用户创建 Alarm Notification文档时设置的期待Alarm通知的时间(=设置时间 - 提前时间),gAlarmLastSendtime值体现了设置Alarm文档时的最近一次Alarm Daemon成功执行的时间点。
同时,这些不生效的Alarm文档,比较($Alarm)中对应文档,发现都是由用户的秘书创建的。
【结论】
按照Lotus Notes中Alarm Daemon运行机制,若设置的Alarm响应时间早于当时的最后一此Alarm Daemon的执行时间,则标识为Invalid Alarm。因而,可以得到结论,由于用户的客户端宿主计算机的时钟,与邮箱数据库所在的mailbox Server的时钟之间存在一定的偏差,使得秘书在创建Alarm文档时设置Alarm响应时间早于保存在邮箱数据库中的LastAlarmDate值,使得Alarm Notification文档在创建时就已经被 Alarm Daemon 判定为 Invalid Alarm, 故而不生效。
【解决方法】
将LastAlarmDate值适当的往前调整,即可保证处于Invalid Alarm状态的Alarm文档,在下次打开数据库时,能够弹出提醒对话框。
下面示例处理方法,采用Lotus Script,利用DB Library中的QueryClose event将LastAlarmDate值调整为2010年元旦:
Sub
Queryclose(Source As Notesuidatabase, Continue As Variant)
Dim s As New notessession
Dim db As notesdatabase
Dim profile As notesdocument
Dim calprofile As notesdocument
Dim ownername As notesname
Dim item As notesitem
Set db = s.CurrentDatabase
Set calprofile =
db.getprofiledocument("Calendarprofile")
If calprofile Is Nothing Then
Exit Sub
Set
item=calprofile.GetFirstItem("Owner")
If item Is Nothing Then Exit Sub
Set ownername = New
NotesName(calprofile.GetItemValue("Owner")(0))
If ownername.canonical =
s.username Then
Set profile =
db.getprofiledocument("CalendarSettings", s.UserName )
If profile Is
Nothing Then Exit Sub
Dim dtLastAlarmDate
As New notesdatetime("01/01/2010 00:01 AM")
profile.lastAlarmDate=dtLastAlarmDate.LocalTime
Call
profile.Save(True, True)
End If
End Sub
注:上述描述仅为本人个人之见,不见得就是正确的。若引用,请自行对后果负责!
阅读(1100) | 评论(0) | 转发(0) |