做这个定时器
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
- 命令行:iisreset
- 先Deactivate feature, 然后activate feature.
- 命令行:net stop SPTimerV3
- 命令行:net start SPTimerV3
- Visual Studio: Attach to process: OWSTIMER.EXE
这样就OK了。