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

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,从而解决了问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值