2

我正在尝试在 WSS 3.0 中创建一个计时器作业。我的计时器作业将创建 SPsite 的对象,然后是 SPWeb,然后是 SPDocumentLibrary(或可能是图片库),使用它们存储在任何 xml 或数据库中的 GUID。之后,它将在某些第三方应用程序中备份文档库中的文档,并然后删除那些文件。

所以我的问题是:理想情况下,我的 SPJobLockType 'None' 或 'Job' 或 'ContentDatabase' 应该是什么?以下是我在阅读了一些关于计时器工作的文章后的理解。如果我在任何地方错了,请纠正我,因为我对 SharePoint 很陌生

  1. 如果我使用“无”,那么我的工作将在场中的每台服务器上运行。我真的需要那个吗?因为我的工作只是修改/删除文档(我通过我的计时器工作只修改内容数据库。如果我错了,请纠正我)。

  2. 如果我使用锁定类型“作业”,那么我的作业将仅在执行作业创建代码的服务器上运行。但它可以满足我的要求(我想是这样,但我不确定如果有错请纠正我)。

  3. 我已经阅读了这篇关于 ContentDatabase LockType 的文章。它说

简而言之,它与作业一几乎相同,这意味着它只运行一台服务器..但是..正如彼得在 SharePoint 2007 中的自定义计时器作业所需的帮助中找到的那样,该作业针对与 WebApplication 关联的每个 ContentDatabase 运行. 另一个(相当烦人的)事实是,它何时在下一个内容数据库上运行是不可预测的。

请提出您的想法/建议。

4

1 回答 1

4

阿诺普,

您描述的“扫描”类型的计时器工作是一种相当常见的工作,我自己为不同的项目编写了其中的一些。在这种类型的计时器作业中,您正在处理一组站点、网站或列表以执行某种维护。一次处理一个站点/网站/列表通常是最简单的,并且正在执行的任务不是需要以最大速度执行的类型(也就是说,需要并发/多线程处理模型来执行的任务)快速完成)。

在这种类型的场景中,我通常将我的计时器作业构建为使用“作业”的 SPJobLockType。正如您所指出的,这可确保在场内的任何给定时间只有一个计时器作业实例在运行。这避免了如果多个实例以“None”的 SPJobLockType 运行时可能发生的冲突,并且它还避免了与“ContentDatabase”的 SPJobLockType 相关联的令人困惑的操作机制(至少我觉得它令人困惑)。

这是我在 CodePlex 上编写并发布的计时器作业的链接。它执行与您描述的相同类型的扫描(在稍高的级别):http: //blobcachefarmflush.codeplex.com/SourceControl/changeset/view/53851#797787。计时器作业的一个实例是在 FeatureReceiver 中使用以下代码行创建的:

BlobCacheFarmFlushTimerJob newJob = new BlobCacheFarmFlushTimerJob(jobName, housingWebApp, null, SPJobLockType.Job);

根据我对您所写内容的理解,我相信“Job”的 SPJobLockType 是合适的。您希望确保一次只运行一个作业实例(以防止同一作业的两个或多个实例尝试处理同一个 SPSite)。

我希望这会有所帮助!

于 2009-08-21T13:50:39.247 回答