定时器

最近最要在MOSS的项目任务中写一个定时提醒的功能,经过考虑采用Timer job来实现,配置信息采用XML文件

        <Items>

      <Item>

  <ListUrl>

  </ListUrl>

  <Field day="0" name="截止日期" startname="创建时间">

  </Field>

  <Body>

  </Body>

  <ToField>

  </ToField>

    </Item>

    </Items>

        以下是代码:



TimerExecute类是执行发送邮件功能类



using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Administration;

using Microsoft.SharePoint.Utilities;

using System.Xml;

namespace MossJob

{

    public class TimerExecute

    {

        public  void Execute(SPWeb web, string siteUrl)

        {

            //xml配置文件信息

            SPListItem it = web.Lists["timerjob"].Items[0];

            SPFile file = it.File;

            XmlDocument doc = new XmlDocument();

            doc.Load(file.OpenBinaryStream());

            XmlNode root = doc.SelectSingleNode("Items");

            XmlNodeList nodes = root.SelectNodes("Item");



            foreach (XmlNode node in nodes)

            {

                string listUrl = siteUrl + node.SelectSingleNode("ListUrl").InnerText;

                SPList list = new SPSite(listUrl).OpenWeb().GetList(listUrl);



                SPView view = list.DefaultView;

                view.Scope = SPViewScope.Recursive;



                SPQuery query = new SPQuery(view);

                XmlNode nodeField = node.SelectSingleNode("Field");

                XmlNode nodeBody = node.SelectSingleNode("Body");

                XmlNode nodeToField=node.SelectSingleNode("ToField");

                string strDay = nodeField.Attributes["day"].Value;

                string strField = nodeField.Attributes["name"].Value;

                string strStartName = nodeField.Attributes["startname"].Value;

                string strQuery = "<Where><Neq><FieldRef Name='Status' /><Value Type='Text' >已完成</Value></Neq></Where>";

                query.Query = strQuery;

                SPListItemCollection items = list.GetItems(query);

                foreach (SPListItem item in items)

                {

                    SPListItem itemRow = list.Items.GetItemById(item.ID);

                    int diff = (Convert.ToDateTime(itemRow[strField] + string.Empty) - DateTime.Now).Days;

                    if (strDay == "0")

                    {

                        if ((Convert.ToDateTime(itemRow[strField] + string.Empty) - Convert.ToDateTime(itemRow[strStartName] + string.Empty)).Days / 2 >= diff)

                        {

                            SendMail(itemRow, nodeBody.InnerText, nodeToField.InnerXml,root.Attributes["path"].Value);

                        }

                    }

                    else if (Convert.ToInt32(strDay) >= diff)

                    {

                        SendMail(itemRow, nodeBody.InnerText, nodeToField.InnerXml,root.Attributes["path"].Value);

                    }

                }

            }

        }



        public  void SendMail(SPListItem item,string strBody,string toFiled,string path)

        {

            string strAssignChange = "(到期提醒)";

            SPList list = item.ParentList;

            StringBuilder strFieldValue = new StringBuilder();

            foreach (string strField in list.DefaultView.ViewFields)

            {

                if (strField != "Attachments")

                {

                    strFieldValue.Append(this.GetValue(strField, list, item));

                }

            }

            string strEmailBody = strBody;

            SPWeb web = list.ParentWeb;

            string strWebUrl = web.Url;

            string strWebTitle = web.Title;

            string strItemTitle = item.Title;

            string strItemUrl = web.Site.Url + item.ParentList.DefaultViewUrl.Substring(0, item.ParentList.DefaultViewUrl.LastIndexOf("/")) + "/dispform.aspx?ID=" + item.ID.ToString();

            string strListUrl = strWebUrl + "/" + list.DefaultViewUrl.Substring(0, list.DefaultViewUrl.LastIndexOf("/"));

            string strListTitle = list.Title;

            string strUpdated = item["Modified"] + string.Empty;

            SPUser user = web.AllUsers.GetByID(Convert.ToInt32(item["Author"].ToString().Split(';')[0]));

            string strAuthor = user.Name;

            string strSubject = strListTitle + "-" + strItemTitle + strAssignChange;

            try

            {

                toFiled = toFiled.Trim(';');

                string[] strUsers = toFiled.Split(';');

                foreach (string field in strUsers)

                {

                    if (item[field].GetType() == typeof(SPFieldUserValueCollection))

                    {

                        SPFieldUserValueCollection users = item[field] as SPFieldUserValueCollection;

                        foreach (SPFieldUserValue u in users)

                        {

                            Microsoft.SharePoint.Utilities.SPUtility.SendEmail(web, true, false, u.User.Email, strSubject, strEmailBody);

                            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true))

                            {

                                sw.WriteLine("ItemID=" + item.ID.ToString() + "User=" + u.User.LoginName + " DateTime=" + DateTime.Now.ToString());

                            }

                        }

                    }

                    else

                    {

                        try

                        {

                            string strFieldUser = item[field] + string.Empty;

                            if (strFieldUser != "")

                            {

                                SPUser fieldUser = web.AllUsers.GetByID(Convert.ToInt32(strFieldUser.Split(';')[0]));

                                Microsoft.SharePoint.Utilities.SPUtility.SendEmail(web, true, false, fieldUser.Email, strSubject, strEmailBody);

                                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true))

                                {

                                    sw.WriteLine("ItemID=" + item.ID.ToString() + "User="+fieldUser.LoginName+" DateTime=" + DateTime.Now.ToString());

                                }

                            }

                        }

                        catch (Exception ex)

                        {

                            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true))

                            {

                                sw.WriteLine("source=" + ex.Source + " Message=" + ex.Message);

                            }

                        }

                    }              

                }

            }

            catch(Exception ex)

            {

                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true))

                {

                    sw.WriteLine("source=" + ex.Source + " Message=" + ex.Message);

                }

            }

        }



        public string GetValue(string strInnerName, SPList list, SPListItem item)

        {

            SPField field = list.Fields.GetFieldByInternalName(strInnerName);

            string strTitle = field.Title;

            string strValue = string.Empty;

            string strEdit = string.Empty;



            strValue = field.GetFieldValueAsText(item[strTitle]);

            strEdit = " ";

            string str = "<tr><td class='formlabel'>{0}:</td><td class='formbody'>{1}</td><td class='altvb'>{2}</td></tr>";

            str = string.Format(str, strTitle, strValue, strEdit);

            return str;

        }

    }

}



TaskListTimerJob 类继承SPJobDefinition,实现定时提醒



using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Administration;

using Microsoft.SharePoint.Utilities;

using System.Xml;

namespace MossJob

{

    public class TaskListTimerJob:SPJobDefinition

    {

        public TaskListTimerJob()

            : base()

        {

        }



        public TaskListTimerJob(string _timername, SPWebApplication _wp)

            : base(_timername, _wp, null, SPJobLockType.ContentDatabase)

        {

            this.Title = _timername;

        }

        public override void Execute(Guid targetInstanceId)

        {

            //base.Execute(targetInstanceId);

            try

            {

                SPWebApplication webapp = this.Parent as SPWebApplication;

                SPContentDatabase contentdb = webapp.ContentDatabases[targetInstanceId];

                string siteUrl = contentdb.Sites[0].Url;

                SPWeb web = contentdb.Sites[0].RootWeb;

                new TimerExecute().Execute(web, siteUrl);

            }

            catch (Exception ex)

            {

                using (System.IO.StreamWriter sw = new System.IO.StreamWriter("c:\timerjob.txt", true))

                {

                    sw.WriteLine("source=" + ex.Source + " Message=" + ex.Message);

                }

            }

        }

    }

}



把上面工程的dll 放到GAC中



Program 是控制台程序,用来部署timer job ,也可以用feature来部署,用控制台程序部署和卸载比较方便



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using MossJob;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Administration;



using Microsoft.SharePoint.Utilities;

using System.Xml;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            try

            {

                SPSite site = new SPSite("http://localhost/");

                SPWebApplication web = site.WebApplication;

                foreach (SPJobDefinition job in web.JobDefinitions)

                {

                    string name = job.Title;

                    if (name == "MyCustomJobSendTaskMail")

                    {

                        job.Delete();

                    }

                }

                TaskListTimerJob newJob = new TaskListTimerJob("MyCustomJobSendTaskMail", site.WebApplication);

                SPSchedule schedule = SPSchedule.FromString("daily at 20:46:00");

                newJob.Schedule = schedule;

                newJob.Update();

                Console.WriteLine("部署成功");

            }

            catch (Exception ex)

            {

                Console.Write(ex.Message);

            }

        }

    }
}

至此timer job 开发和部署完成,Timer job 主要是继承SPJobDefinition类,重写Execute方法即可。

你可能感兴趣的:(定时器)