SharePoint Debug - SharePoint timer job 发送重复邮件

来源:互联网 发布:软件行业 平均 利润率 编辑:程序博客网 时间:2024/05/06 09:06

SharePoint环境是这样的,有两个前端服务器,采用负载均衡技术。Farm中有两个web application。我自定义了一个timer job,定时发送邮件给SharePoint用户,但是有的用户却经常收到重复的邮件,内容一模一样,发送时间前后相差无几。

为了解决问题,首先需要判断到底是是SharePoint发送了重复的邮件,还是邮件服务器发送了重复的邮件。于是我拿到重复的两封邮件,使用outlook查看Message-ID,发现虽然这两封邮件内容一样,但是Message-ID是不一样的,说明这两封邮件并不是重复的邮件,而确实是SharePoint发了两封不同的邮件出来。

通常情况下,发送重复邮件可能是由于一个timer job运行在不同的web application中。于是我只留下一个web application下的timer job,其他web application下的发邮件的timer job都disable了,问题还是没有解决。于是怀疑是负载均衡的问题。

发邮件的timer job每发送一封邮件都会写一条SharePoint log,我在检查两个server的log的时候,发现同一封邮件,在两个server上都有log记录,这就说明了,虽然timer job运行在同一个web application下,但是在负载均衡的环境中运行timer job,每一个server都会发一次邮件,于是怀疑是代码有问题,尤其是timer job的锁。

在检查代码的时候发现,果然是timer job的锁的问题。我们知道在定义timer job的时候,构造函数中需要指定锁的类型:

public EmailNotificationJob(string name, SPWebApplication webApp) : base(name, webApp, null, SPJobLockType.ContentDatabase){    ... ...}

其中锁的类型是一个枚举:

// Summary:    //     Values for the lock type of a job definition.    public enum SPJobLockType    {        // Summary:        //     No locks        None = 0,        //        // Summary:        //     Locks the content database before processing.        ContentDatabase = 1,        //        // Summary:        //     Locks the job to prevent it from running on more than one machine.        Job = 2,    }
代码中指定锁的类型是SPJobLookType.ContentDatabase,而正确的锁的类型应该是SPJobLookType.Job,从定义来看,SPJobLookType.Job只允许timer job运行在一台server上,正适合使用在负载均衡的环境中。于是将timer job的锁改为Job,从而解决了问题。

0 0
原创粉丝点击