Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432317
  • 博文数量: 73
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 1260
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-28 09:31
文章分类

全部博文(73)

文章存档

2011年(1)

2010年(18)

2009年(28)

2008年(26)

我的朋友

分类:

2010-06-21 22:20:34


    个把月前,遇到一个奇异的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) |
给主人留下些什么吧!~~