做这个定时器Andrew Connell的博客给我很大的帮助。里面有所有的源代码,思路也很清晰
http://www.andrewconnell.com/blog/articles/CreatingCustomSharePointTimerJobs.aspx


主要是继承SpJobDefinition,改写几个构造体和Execute的方法.基本代码的模式就是这个样子:
下面是自己的一段代码有些凌乱:
  1 class EventCheckTimesSendEmail : SPJobDefinition
  2    {
  3        public EventCheckTimesSendEmail() : base() { }
  4        public EventCheckTimesSendEmail(string _timername, SPWebApplication _wp)
  5            : base(_timername, _wp, null, SPJobLockType.ContentDatabase)
  6        {
  7            this.Title = "SendEmailEventCheckTime";
  8        }

  9        public override void Execute(Guid targetInstanceId)
 10        {
 11//这些参数都是从OwsTimer.exe.config中读取的。这个文件是自己添加的。参数也可以自己写的。
 12            SPWebApplication webApplication = this.Parent as SPWebApplication;
 13            SPContentDatabase contentDb = webApplication.ContentDatabases[targetInstanceId];
 14            string splistname = ConfigurationManager.AppSettings.Get("ListName");
 15            string smtpHost = ConfigurationManager.AppSettings.Get("SmtpHost");
 16            string smtpName = ConfigurationManager.AppSettings.Get("SmtpName");
 17            string smtpPass = ConfigurationManager.AppSettings.Get("SmtpPass");
 18            string emailTitle = ConfigurationManager.AppSettings.Get("EmailTitle");
 19            string emailContent = ConfigurationManager.AppSettings.Get("EmailContent");                             
 20            string spwebName = ConfigurationManager.AppSettings.Get("SpwebName");
 21            SPWeb spweb = contentDb.Sites[0].AllWebs[spwebName];
 22            DateTime dt;           
 23            foreach (SPListItem spli in spweb.Lists[splistname].Items)
 24            {
 25                string spff = null;
 26                
 27                Stream stream = spli.File.OpenBinaryStream();
 28                StreamReader sr = new StreamReader(stream);
 29                XmlDocument xd = new XmlDocument();
 30                xd.LoadXml(sr.ReadToEnd());
 31                XmlNamespaceManager xnm = new XmlNamespaceManager(xd.NameTable);
 32                xnm.AddNamespace(xd.DocumentElement.Prefix, xd.DocumentElement.NamespaceURI);
 33             //XmlNode xnItemDateLine = xd.SelectSingleNode(ItemDateLine, xnm);
 34                XmlNode xncommitteeAcion = xd.SelectSingleNode(committeeAcion, xnm);
 35                XmlNode xnsubmissionType=xd.SelectSingleNode(submissionType,xnm);
 36                dt = Convert.ToDateTime(xd.SelectSingleNode(ItemDateLine, xnm).InnerText);
 37
 38                TimeSpan ts;
 39                DateTime dtNow = DateTime.Now;
 40                string monthsStr = xd.SelectSingleNode(renewal, xnm).InnerText;
 41                string toemail = itemEmail.ToString();
 42
 43                int otherMonthNum = 0;
 44                string dateunit=null;
 45                if (monthsStr.Equals("Other"))
 46                {
 47                    if (xd.SelectSingleNode(otherRenewal,xnm).InnerText.ToString().Trim() != null)
 48                    {
 49                        string DateUnits = xd.SelectSingleNode(ItemDateUnits, xnm).InnerText.ToString();
 50                        string reOther = xd.SelectSingleNode(otherRenewal, xnm).InnerText.ToString();
 51                        otherMonthNum = int.Parse(reOther);
 52                        DateTime dtotherDate;
 53                        if (DateUnits.Equals("Days"))
 54                        {
 55                            dtotherDate = dtNow.AddDays(otherMonthNum);
 56                            dateunit = "Days";
 57                        }

 58                        else if (DateUnits.Equals("Months"))
 59                        {
 60                            dtotherDate = dtNow.AddMonths(otherMonthNum);
 61                            dateunit = "Months";
 62                        }

 63                        else if (DateUnits.Equals("Years"))
 64                        {
 65                            dtotherDate = dtNow.AddYears(otherMonthNum);
 66                            dateunit = "Years";
 67                        }

 68                        else
 69                        return; }
 70                        ts = (dt.Date - dtotherDate.Date);
 71                    }

 72                    else return; }
 73                }

 74                else
 75                {
 76                    //sendEmail time
 77                    string[] monthss = monthsStr.ToString().Trim().Split('M');
 78                    otherMonthNum = int.Parse(monthss[0].ToString());
 79                    DateTime dtMoth = dtNow.AddMonths(otherMonthNum);
 80                    dateunit = "Months";
 81                    ts = (dtMoth.Date - dt.Date);                  
 82                }

 83                string sateTime = otherMonthNum + " " + dateunit + " mails reply";
 84                //if (ts.Days == 0)
 85                //{
 86                //    string to = toemail;
 87                //    string title = emailTitle;
 88                //    string content = emailContent + ", This " + otherMonthNum + " " + dateunit + " mails reminds ahead of time";
 89
 90                //  //  string returnValues = SendEmial(smtpHost, smtpName, smtpPass, to, title, content);
 91                //}
 92                if (ts.Days == 0 && xncommitteeAcion.InnerText.ToString().Equals(actionSates) && !xnsubmissionType.InnerText.ToString().Equals(submissionTypeValue.ToString()) && spli["SatesOfTimer"== null)
 93                {
 94                    //Send Email
 95                    string to = toemail;
 96                    string title = emailTitle;
 97                    string content = emailContent + ", This " + otherMonthNum + " " + dateunit + " mails reminds ahead of time";
 98                    string returnValues = SendEmial(smtpHost, smtpName, smtpPass, to, title, content);
 99
100                    //add a listitem
101                    if (returnValues.Equals("OK"))
102                    {
103                        spli["SatesOfTimer"= otherMonthNum + " " + dateunit + " mails reply";
104                        spli.Update();
105                        spweb.Update();
106
107                    }

108                }

109                else if (ts.Days == 0 && xncommitteeAcion.InnerText.ToString().Equals(actionSates) && !xnsubmissionType.InnerText.ToString().Equals(submissionTypeValue.ToString()) && !spli["SatesOfTimer"].ToString().Equals(sateTime))
110                {
111                    //Send Email
112                    string to = toemail;
113                    string title = emailTitle;
114                    string content = emailContent + ", This " + otherMonthNum + " " + dateunit + " mails reminds ahead of time";
115                    string returnValues = SendEmial(smtpHost, smtpName, smtpPass, to, title, content);
116
117                    //add a listitem
118                    if (returnValues.Equals("OK"))
119                    {
120                        spli["SatesOfTimer"= otherMonthNum + " " + dateunit + " mails reply";
121                        spli.Update();
122                        spweb.Update();
123                    }

124                }

125
126            }

127        }

128     
129        private string  SendEmial(string smtpHost, string smtpName, string smtpPass, string to, string title, string content)
130        {
131            MailAddress sendto = new MailAddress(to);
132            MailAddress sendForm = new MailAddress(smtpName);
133            MailMessage _mailMessage = new MailMessage(sendForm, sendto);
134            _mailMessage.Subject = title;
135            _mailMessage.Body = content;
136            _mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
137            SmtpClient _smtpClient = new SmtpClient(smtpHost);
138            _smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;                    
139            _smtpClient.Credentials = new System.Net.NetworkCredential(smtpName, smtpPass);
140
141            try
142            {
143                _smtpClient.Send(_mailMessage);
144                return "OK";
145            }

146            catch (Exception ex)
147            {
148                return ex.Message;   
149            }

150        }
     

151

另外一个类就是:
 1 class EventCheckTimersInstallerSendEmail : SPFeatureReceiver
 2    {
 3        const string MY_TASK = "EventCheckTimesSendEmail";
 4        public override void FeatureInstalled(SPFeatureReceiverProperties properties)
 5        {
 6
 7        }

 8        public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
 9        {
10
11        }

12        public override void FeatureActivated(SPFeatureReceiverProperties properties)
13        {
14            SPSite spsite = properties.Feature.Parent as SPSite;
15
16            foreach (SPJobDefinition job in spsite.WebApplication.JobDefinitions)
17            {
18                if (job.Name == MY_TASK)
19                    job.Delete();
20            }

21
22            EventCheckTimesSendEmail timer = new EventCheckTimesSendEmail(MY_TASK, spsite.WebApplication);
23
24            //时间写短点是为测试
25            SPMinuteSchedule schedule = new SPMinuteSchedule();
26            schedule.BeginSecond = 0;
27            schedule.EndSecond = 59;
28            schedule.Interval = 59;
29
30            timer.Schedule = schedule;
31            timer.Update();
32            
33        }

34
35        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
36        {
37            SPSite spsite = properties.Feature.Parent as SPSite;
38            foreach (SPJobDefinition job in spsite.WebApplication.JobDefinitions)
39            {
40                if (job.Name == MY_TASK)
41                    job.Delete();
42            }

43        }

44    }
接下来就是部署这个写好的定时器。
用Stsadm.exe来部署

代码写完了以后,还要写一个Feature,这个Feature比较简单,就一个XML文件

Feature.xml

<?xml version="1.0" encoding="utf-8" ?>

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"

         Id="1F481C17-4FDA-4919-A64A-EAE5C1301B4B"

         Title="Image Validation Checker"

         Description="If any images in the top level site colleciton images are expiring soon,email relative person."

         Scope="Site"

         Hidden="TRUE"

         Version="1.0.0.0"

         ReceiverAssembly="TimerJobControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f2aef6a9088f714f"

ReceiverClass="TimerJobControl.ImageValidationCheckerJobInstaller">

</Feature>

剩下的就是把feature装好就好了,假如代码没有出错的话。

至于怎么Debug这个程序,走以下步骤
Assembly DLL放到GAC

  1. 命令行:iisreset
  2. Deactivate feature, 然后activate feature.
  3. 命令行:net stop SPTimerV3
  4. 命令行:net start SPTimerV3
  5. Visual Studio: Attach to process: OWSTIMER.EXE

 

这样就OK了。

posted on 2008-06-18 19:32  ◎寶☆呗  阅读(1937)  评论(3编辑  收藏  举报