级别: 中级
Alaa Mahmoud, 软件工程师 , IBM ,2005 年 9 月 20日
糟糕,由于计算机出现故障,最近几个小时的工作全部丢失了!如果没有考虑到不断保存文档,简直太糟糕了。现在不用担心了,这都要感谢 Lotus Notes/Domino 7 中所引入的 AutoSave 新功能。
当经过了数小时的输入、格式排版、校对检查,正在对即将提交给经理的报告做最后的修改时,突然,您的计算机死机了或者发生其他意外事件,导致所有的工作全部丢失,那该怎么办?这时,您可能才想起来“噢,天啊,我忘记保存文档了!”然后,您会问自己(这时是凌晨两点,您一定是独自一人在工作,否则还可以与他人交谈!),“我是从头开始写报告呢,还是应该开始重新找工作?”如果类似这样的事情发生在您身上,您可能会希望有一个保护天使,能随时保存您的工作,这样当发生意外事故时,还可以找到该工作文档。
AutoSave 就是那个保护天使!它是 Notes 7.0 中所引入的众多非常棒的功能之一。启用 AutoSave 后,Notes 文档会被保存(按照用户设置的计时器事件进行保存)到本地数据库中。这样,如果 Notes 或计算机由于某种原因崩溃了,会为您最近的工作保留一个副本,以便恢复。
想了解 AutoSave 的详细信息以查看我们是如何设计的,以及如何启用并使用它吗?如果愿意,请继续阅读本文!本文假设您是一位有经验的 Notes 用户。
设计 AutoSave
当开始开发 AutoSave 时,我们有如下预期目标:
..用户必须能够在其指定的固定时间间隔自动保存文档。
..当由于某种原因导致 Notes 客户机发生故障,重新启动后,用户必须能恢复已经保存过的文档。
AutoSave 必须安全加密,以便所有用户信息都是加密的。
AutoSave 必须快速完成,并且必须避免任何其他的服务器活动。
..用户必须能够打开或关闭 AutoSave 功能,如由管理员通过策略对其进行控制。
一个典型场景
当开始设计 AutoSave时,假想有这样一个场景:您正在愉快地对某个文档进行操作,这时发生了一件意想不到的事情,导致您所做的工作都丢失了。这时该怎么办?
您可能会想到多种解决办法。例如,在工作过程中可以启动一个计时器,并不断地保存文档。我们很快发现这个解决方案有很多问题。首先,如果有 1000 个用户都选择将他们的 AutoSave 时间间隔设置为 1 分钟,并且他们每分钟都需要访问服务器,这时该怎么办?这会造成性能急剧下降,并且服务器响应时间会加长。其次,如果没有对文档进行操作,并且文档处于“半完成”状态,您不想任何人查看该文档时该怎么办?如果只有写权限而没有删除权限该怎么办?如果数据库具有验证代码,这些代码要求在保存文档之前,各个字段都必须填写完整,并且如果还未填写完整就试图保存文档会产生各种错误,该怎么办?如果表单在 Post Save 或 Query Save 事件中具有向其他事件发送电子邮件的代码,告诉它们已经可以对文档进行检查了,该怎么办?如果……该怎么办?您一定知道答案了。您可能会猜测到,我们没有这么做。另一种想法类似于第一个,但是对该文档做了一个“无提示”保存(一种不会引发任何事件的保存方法),将其保存到本地加密数据库中了。当出现故障,用户重新启动 Notes 客户机后,检查该数据库中是否有可用文档。如果有,向用户显示这些文档,由用户决定是否要恢复。这就是我们所采取的方法,它确实有效!
采用这种方法,可以通过使用本地数据库来避免操作服务器。我们还提供了一个安全的解决方案(加密数据库)防止出现错误,或在保存的同时发送电子邮件(因为没有引发任何事件),并且您可以完全自由决定是否要恢复正在工作的文档。
使用 AutoSave
使用 AutoSave 包括下列操作:
..在客户机上启用 AutoSave
..在表单中启用 AutoSavAutoSave
..通常的 AutoSave 操作
..恢复自动保存过的文档
下列部分详细解释了这些活动。
在客户机上启用 AutoSave
安装 Notes 7.0 时,默认情况下, AutoSave 未被启用。未启用的原因是因为用户可能不知道当他们第一次看到 AutoSave处于运行状态时会出现什么情况。而且,有些用户使用的机器可能速度比较慢,在这样的机器上,“自动保存”大型文档可能需要占用很长时间。因此,如果想激活 AutoSave,必须通过 User Preferences 对话框中的一个新选项来启用它(参见图 1):
图 1. User Preferences 对话框
我们添加了一个复选框以启用 /禁用 AutoSave,以及一个用于设置时间间隔的字段。时间间隔可以是 1 分钟到999 分钟之间的任何值。这些 AutoSave 用户惯用选项与客户机的 Notes.ini 文件中的三个变量相对应。下表显示
了这些选项所对应的 Notes.ini 变量:
Notes.ini 设置 |
用户惯用选项设置 |
AUTO_SAVE_ENABLE = n |
当设为 1 时,AutoSave 被启用。当设为 0 时,AutoSave 被禁用 |
AUTO_SAVE_INTERVAL = |
设置自动保存时间间隔 |
AUTO_SAVE_USER,= |
解决命名冲突(参见本文后面的解释) |
在表单中启用 AutoSave
正如前面所提到的,无提示保存不会引发任何事件。使用无提示保存进行 AutoSave 的原因是想确保 AutoSave 是一个“无缝”操作 ——启用它之后,忘记有关它的一切操作,直到发生意外情况,然后它开始起作用,告诉您有一个或多个可以恢复的文档。如果文档未完成,引发这样的事件会产生错误(在某些情况下通常这样)。这些事件还会发送电子邮件,并且会导致意想不到的结果。因此,自动保存文档时,不引发这些事件。这时,您可能要问,如果表单要依靠这些事件,该怎么办?答案很简单,它不会起作用的!要解决这个问题,我们添加了一个新的 Form Properties ,用于确定表单能否被自动保存。这样就可以允许模板开发人员或应用程序设计人员对他们的应用程序进行测试并查看它能否被安全地自动保存和恢复。如果可以安全地自动保存和恢复,他们可以打开 Form Properties 信息框,转到第一个附签,选择 Allow AutoSave 复选框(参见图 2):
图 2. Allow AutoSave 选项
只有由表单创建的且选中了 Allow AutoSave 的文档能被自动保存。这是确保文档被自动保存后能被恢复的惟一方法。很多 Notes/Domino应用程序在它们的 Save 和 Post Save 事件中都有代码,这些事件会创建字段,或执行在加载时检查的验证。因为在自动保存文档时无法执行这些事件,所以这些事件都不会发生,并且自动保存后的文档也将会处于“坏的”状态。这将导致恢复后无法加载文档。
如果应用程序没有在保存事件上写入任何字段,并且它要依靠这些字段,那么可能需要在 Query Open事件中添加代码,将那些字段设为默认值。甚至可以通过查找一个名为 $AutoSaveRecovered的字段仅对恢复后的文档做一些特殊处理。该字段将仅可用于恢复后的文档,直到 Post Open 事件在那之后被删除。通过编程对单个文档禁用 AutoSave 的另一种方法是添加字段 $DontAutosave。该字段会防止对文档进行自动保存。如果删除了 $DontAutosave,则文档可以重新被自动保存。
注意:在 Notes/Domino 7.0 中,启用了 AutoSave 的惟一模板表单是 Memo表单。
通常的 AutoSave 操作
现在既在 Notes 客户机上又在表单中启用了 AutoSave,可以开始准备回滚。打开一个文档后开始输入,会启动一个计时器,等待所设置的要通过的时间间隔。仅当对文档进行修改时才会启动计时器,这样当仅对文档进行查看
时,可以防止磁盘活动。间隔时间过去后, AutoSave 执行一次无提示保存,而不会引发任何事件(正如前面所提到的)。本地磁盘上 AutoSave数据库中出现的被保存文档的副本包括几个附加字段,这些字段有助于 AutoSave 在出现故障时恢复该
文档。这些字段如下所示:
字段名称说明
字段名称 |
说明 |
$AutoSaveDataBase |
文档所驻留的数据库的名称 |
$AutoSaveDocTitle |
文档标题 |
$AutoSaveNoteID |
文档的注释 ID |
$AutoSaveOrgDocRL |
用于打开文档的资源链接 |
$AutoSaveServer |
数据库副本所驻留的服务器名称 |
$AutoSaveTime |
文档的最后修改事件 |
启动自动保存后,状态栏上将显示下列信息: Autosaving document : ...
AutoSave 操作完成后,状态栏上将显示另一则消息(参见图 3):
AutoSave complete : ...
图 3. AutoSave 消息
看到 AutoSave 完成后,您的数据即被保存,并可以在 Notes 发生故障后再次启动 Notes 时恢复。这意味着将在该本地数据库中保存有大量的文档吗?不会很多!保存文档、删除文档或用电子邮件发送之后,会删除自动保存副本以节省 AutoSave数据库空间。这样还使得只查看最想要恢复的文档更加简便。这时,您已经涉及到了故障事件,因为 AutoSave会定期(最好是在故障发生之前不久)保存该文档。但是如果正在编辑文档(屏幕闪烁、光标停滞、蓝色框闪烁,等等)时怀疑发生了意外,该怎么办?在这些情况下,可以随时
强制执行 AutoSave。要实现这一点,请转到 File 菜单,选择 AutoSave,然后单击 AutoSave Now。这将强制立即执行 AutoSave。
恢复自动保存过的文档
下面是发生故障后重新启动 Notes 客户机时会发生的事件的顺序。在客户机启动时,通过身份验证后,将检查 AutoSave数据库中是否有文档。如果有,将提示您指定是否要恢复未保存的工作(参见图 4)。
图 4. Unsaved Work 对话框
如果选择 Yes,会提示您指定想还原哪个未保存的文档。然后将看到一个类似于图 5 的对话框,上面列出了可以恢复的所有文档,并提供了几个恢复选项:
选项说明
选项 |
说明 |
Recover |
恢复所选文档并将其从列表中删除 |
Recover All |
恢复所有文档,不对每个文档都进行提示,如果没有错误,将关闭对话框 |
Delete |
从本地 AutoSave 数据库中删除该文档,并且不对原始文档做任何更改 |
Delete All |
从本地 AutoSave 数据库中删除所有文档,并且不对原始文档做任何更改 |
图 5. Recover Unsaved Documents 窗口
Recover Unsaved Documents 窗口中的字段显示了下列信息:文档被自动保存的时间、原始数据库的路径名 /文件名以及数据库所驻留的服务器的名称。
如果无法访问原始 Notes 数据库的任何副本,则无法恢复文档,因此只是保留注释原来的样子,稍后再重新尝试恢复。如果自上次 AutoSave以来文档被修改,我们会通知您自最后一次崩溃时原始文档被修改,会让您选择是覆盖原始文档还是保留新文档。如果选择恢复文档,将在 Notes 中打开文档,并提示选择是放弃更改或保存更改。但是在恢复后, AutoSave 将不会帮您自动保存文档。
AutoSave以来文档被修改,我们会通知您自最后一次崩溃时原始文档被修改,会让您选择是覆盖原始文档还是保留新文档。如果选择恢复文档,将在 Notes 中打开文档,并提示选择是放弃更改或保存更改。
但是在恢复后, AutoSave 将不会帮您自动保存文档。
AutoSave 数据库
我们最初将 AutoSave 设计为使用从 Autosave.ntf 创建的单一数据库 (Autosave.nsf)。该数据库被加密了。但是,最终遇到了一个潜在问题。在早期的测试过程中,发现在很多 Notes/Domino环境中,多数用户使用相同的Notes Data 目录,并且每个用户具有一个单独的 Location 文档。默认情况下, AutoSave.nsf 位于用户的 Data 目录下并被加密(使用中等加密)。因此当第一个用户创建第一个 AutoSave数据库时,将用该用户的密钥对其进行加密。因此,其他用户无法使用该数据库,这样对他们来说 AutoSave 将被禁用。为避免发生这种情况,我们决定使用类似于用于命名邮件文件的命名约定来创建 AutoSave 数据库。要实现这一点,可以在数据库名称的开头附上 as_ at。例如,对于 Alaa Mahmoud,AutoSave 数据库名称为 as_Amahmoud.nsf。如果已经存在具有该名称的数据库,则将 1 附加到该名称上,重新检查,如果名称仍然存在,则附加 2,直到具有惟一的 AutoSave 数据库名称。
解决命名冲突
使用我们的命名解决方案,名称有时会发生冲突,例如 John Smith、Jane Smith、Jen Smith、Jon Smith 等等。要确保为当前用户获取正确的数据库,为用户创建数据库后,需要在用户的 Notes.ini文件中创建下面一项:
AUTO_SAVE_USER,
=
例如:
AUTO_SAVE_USER,Alaa Mahmoud/Westford/IBM=as_AMahmoud2.nsf
这将允许事件按下列顺序发生。用户通过特定的 ID启动 Notes。检查 Notes.ini 中是否存在该用户名称的一项。如果存在,则使用该项中的数据库名称。如果那个数据库不存在,将创建一个新数据库(在用户将数据库删除的情况下)。如果用户无权访问该数据库,用户将收到一个错误, AutoSave被禁用。如果找不到具有用户名称的项,我们将基于本节前面所描述的命名约定来创建项和数据库。如果用户切换了 ID,Notes 将关闭所有已经打开的文档。因此,打开自动保存的文档没有问题。
使用策略设置 AutoSave 选项
对于想启用或禁用 AutoSave 的管理员(或那些想确保用户具有相同的 AutoSave标准时间间隔的管理员)来说,可以通过策略文档来实现。要实现这一点,请打开 Domino Admin 客户机,选择 File - Open Server。然后输入想要管理的服务器的名称。这将打开服务器上的 Domino Directory。从左侧导航面板中选择 Settings。然后可以选择 Add Settings - Desktop/Setup Setting,或者也可以选择一个现有的 Desktop Settings 文档,单击 Edit
Settings。打开文档后,选择 Preferences - Basics 附签,将出现如图 6 所示的屏幕:
图 6. Desktop Settings 屏幕
完成两个与 AutoSave 相关的选项:
Enable AutoSave 为用户启用 /禁用 AutoSave 功能。当被禁用时,用户即不能使用 AutoSave。
AutoSave every N minutes 设置 AutoSave 的时间间隔(以分钟为单位)。
结束语
在本文中,我们了解到 AutoSave 是一种非常棒的功能。它可以在发生意外的情况下保存工作,该功能可由用户通过 User Preferences进行设置,也可以通过策略由管理员来设置。设计人员在确保他们的表单不依靠不会引发的
任何事件后,需要为他们的表单启用 AutoSave。最后,我们了解到通过使用加密的本地数据库, AutoSave 会快速完成而且很安全。
因此,现在对 Notes 文档进行操作时,如果出现意外故障(多少故障是“不可预料的”?),不用担心 —— AutoSave可以来挽救!
关于作者
Alaa Mahmoud 是一位软件工程师,于 20 世纪 90 年代中期加盟 IBM。他担任 Lotus Notes Core Services 小组和 Editor 小组的技术负责人,从 R5 即开始从事 Notes 方面的工作。Alaa 是一位软件国际化专家,尤其擅长于双语(阿拉伯语和希伯来语)方面。
阅读(2658) | 评论(0) | 转发(0) |