自动加载修改过的配置文件。
核心类如下:
18publicclassTaskConfig:IConfigurationSectionHandler
19{
20IConfigurationSectionHandlerMembers#regionIConfigurationSectionHandlerMembers21publicstaticobjectReadConfig(stringFileName,stringSectionName)
22{
23XmlReaderreader=null;
24try25{
26XmlDocumentdoc=newXmlDocument();
27reader=newXmlTextReader(FileName);
28doc.Load(reader);
29XmlNodenode=doc.SelectSingleNode("configuration/"+SectionName);
30returnReadConfig(node);
31}32catch33{
34throw;
35}36finally37{
38if(reader!=null)
39reader.Close();
40}41returnnull;
42}43publicstaticobjectReadConfig(System.Xml.XmlNodesection)
44{
45List<TaskItem>list=newList<TaskItem>();
46TaskItemti=null;
47foreach(System.Xml.XmlNodenodeinsection.ChildNodes)
48{
49try50{
51ti=newTaskItem();
52ti.JobName=node.Attributes["JobName"].Value;
53ti.JobTime=int.Parse(node.Attributes["JobTime"].Value);
54//ti.Task=(ITask)newSystem.Reflection.Assembly.CreateInstance(node.Attributes["Task"].Value);55stringstr=node.Attributes["Type"].Value.ToString();
56ti.Task=(ITask)Type.GetType(str).Assembly.CreateInstance(str.Split(',')[0]);
57Console.WriteLine("JobName={0},JobTime={1},Type={2}",ti.JobName,ti.JobTime,str);
58}59catch(Exceptionee)
60{
61EventLogHandle.WriteException(ee);
62continue;
63}64list.Add(ti);
65}66returnlist;
67}68publicobjectCreate(objectparent,objectconfigContext,System.Xml.XmlNodesection)
69{
70returnReadConfig(section);
71}72
73#endregion74}75publicinterfaceITask
76{
77voidExecute(GuidSiteID);
78}79publicclassTaskItem
80{
81publicstringJobName="";
82publicstringSiteName="";
83publicintJobTime=5;
84publicintCurrentTime=0;
85publicITaskTask=null;
86}87publicclassTask:Microsoft.SharePoint.Administration.SPJobDefinition
88{
89publicTask()
90:base()
91{
92ReadConfig();
93}94
95publicTask(stringjobName,SPServiceservice,SPServerserver,SPJobLockTypetargetType)
96:base(jobName,service,server,targetType)
97{
98ReadConfig();
99}100
101publicTask(stringjobName,SPWebApplicationwebApplication)
102:base(jobName,webApplication,null,SPJobLockType.ContentDatabase)
103{
104this.Title="TaskLogger";
105ReadConfig();
106}107staticHashtableob=newHashtable();
108staticList<TaskItem>list=newList<TaskItem>();
109staticGuidFeatureID=newGuid("1F481C17-4FDA-4919-A64A-EAE5C1301B4B");
110privatestringbasepath=AppDomain.CurrentDomain.BaseDirectory;//@"C:\ProgramFiles\CommonFiles\MicrosoftShared\webserverextensions\12\bin";111privatestringconfigName="OwsTimer.exe.config";//"Task.dll.config";112/**////<summary>113///读取配置信息:
114///格式:
115///<Jobs>116///<JobJobName="JobName"Type=""JobTime="2"SiteName=""/>117///</Jobs>118///</summary>
119privatevoidReadConfig()
120{
121list=TaskConfig.ReadConfig(basepath+"\\"+configName,"Jobs")asList<TaskItem>;
122StartWatcher(basepath,configName,true);
123}124staticFileSystemWatcherwatcher=newFileSystemWatcher();
125[PermissionSet(SecurityAction.Demand,Name="FullTrust")]
126privatestaticvoidStartWatcher(stringFilepath,stringstrFilter,boolflag)
127{
128
129try130{
131if(flag==true)
132{
133EventLogHandle.WriteEvent(newstring[]{"启动文件监视器开始……"});
134watcher.Filter=strFilter;
135watcher.Path=Filepath;
136watcher.NotifyFilter=NotifyFilters.LastWrite;
137watcher.Changed+=newFileSystemEventHandler(OnChanged);
138EventLogHandle.WriteEvent(newstring[]{"文件监视器启动成功。"});
139}140else141{
142EventLogHandle.WriteEvent(newstring[]{"关闭文件监视器开始……"});
143watcher.Changed-=newFileSystemEventHandler(OnChanged);
144EventLogHandle.WriteEvent(newstring[]{"文件监视器关闭完成"});
145}146watcher.EnableRaisingEvents=flag;
147}148catch(Exceptionee)
149{
150EventLogHandle.WriteException(ee);
151}152}153privatestaticvoidOnChanged(objectsource,FileSystemEventArgse)
154{
155System.Threading.Thread.Sleep(5000);
156lock(ob.SyncRoot)
157{
158list.Clear();
159try160{
161list=TaskConfig.ReadConfig(e.FullPath,"Jobs")asList<TaskItem>;
162}163catch(Exceptionee)
164{
165list=newList<TaskItem>();
166EventLogHandle.WriteException(ee);
167}168}169}170/**////<summary>171///执行多个任务
172///</summary>173///<paramname="contentDbId"></param>
174publicoverridevoidExecute(GuidcontentDbId)
175{
176lock(ob.SyncRoot)
177{
178foreach(TaskItemtiinlist)
179{
180try181{
182ti.CurrentTime++;
183if(ti.CurrentTime==ti.JobTime)
184{
185//foreach(SPSitesiteinWebApplication.Sites)
186//{
187//foreach(SPFeaturefeainsite.Features)
188//{
189//if(fea.Definition.SolutionId==FeatureID&&fea.Definition.Status==SPObjectStatus.Online)
190//{
191//try
192//{
193//ti.Task.Execute(site.ID);
194//}
195//catch(Exceptionee)
196//{
197//WriteEvent(site.Url,ee.ToString());
198//EventLogHandle.WriteException(ee);
199//}
200//}
201//}
202//}203ti.Task.Execute(contentDbId);
204
205}206}207catch(Exceptioneee)
208{
209WriteEvent(ti.JobName,eee.ToString());
210EventLogHandle.WriteException(eee);
211}212finally213{
214if(ti.CurrentTime==ti.JobTime)
215{
216ti.CurrentTime=0;
217}218}219}220}221/**/////getareferencetothecurrentsitecollection'scontentdatabase
222//SPWebApplicationwebApplication=this.ParentasSPWebApplication;
223//SPContentDatabasecontentDb=webApplication.ContentDatabases[contentDbId];224225/**/////getareferencetothe"Tasks"listintheRootWebofthefirstsitecollectioninthecontentdatabase
226//SPListtaskList=contentDb.Sites[0].RootWeb.Lists["Tasks"];227228/**/////createanewtask,settheTitletothecurrentday/time,andupdatetheitem
229//SPListItemnewTask=taskList.Items.Add();
230//newTask["Title"]=DateTime.Now.ToString();
231//newTask.Update();
232//SPSecurity.RunWithElevatedPrivileges(delegate()
233//{
234//try
235//{
236//using(StreamWritersw=newStreamWriter("C:\\time.txt",false,System.Text.Encoding.UTF8))
237//{
238//sw.WriteLine("这是第{0}次写入,当前时间是:{1}",nCount.ToString(),DateTime.Now.ToLongDateString());
239//}
240//}
241//catch
242//{
243//}
244//});245}246staticvoidWriteEvent(stringSiteName,stringmsg)
247{
248SPSecurity.RunWithElevatedPrivileges(delegate()
249{
250try251{
252using(StreamWritersw=newStreamWriter("C:\\time.txt",true,System.Text.Encoding.UTF8))
253{
254sw.WriteLine("\n时间:{2}\n站点名称:{0}\n日志信息:{1}",SiteName,msg,DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss"));
255}256}257catch258{
259}260});
261}262}263
264classEventLogHandle
265{
266staticEventLog_eventLog=null;
267staticEventLogHandle()
268{
269_eventLog=newEventLog("Application",".","SPTaskProvider");
270}271publicstaticvoidWriteException(Exceptione)
272{
273_eventLog.WriteEntry(string.Concat(e.Message,Environment.NewLine,Environment.NewLine,e.StackTrace),EventLogEntryType.Error);
274}275publicstaticvoidWriteEvent(string[]strArray)
276{
277_eventLog.WriteEntry(string.Concat(strArray),EventLogEntryType.Information);
278}279publicstaticvoidWriteWarn(string[]strArray)
280{
281_eventLog.WriteEntry(string.Concat(strArray),EventLogEntryType.Warning);
282}283}284}285
调试用控制台源
码:
13classProgram
14{
15staticList<TaskItem>list=newList<TaskItem>();
16staticTasktask=null;
17staticvoidMain(string[]args)
18{
19Console.ReadKey();
20System.Timers.Timertime=null;
21try22{
23task=newTask();
24time=newSystem.Timers.Timer();
25time.Interval=10000;
26time.Enabled=true;
27time.Elapsed+=newSystem.Timers.ElapsedEventHandler(time_Elapsed);
28}29catch(Exceptionee)
30{
31Console.Write(ee.ToString());
32}33Console.ReadKey();
34time.Enabled=false;
35}36
37staticvoidtime_Elapsed(objectsender,System.Timers.ElapsedEventArgse)
38{
39if(task!=null)
40task.Execute(Guid.Empty);
41}42}43publicclassTask1:ITask
44{
45ITaskMembers#regionITaskMembers46
47publicvoidExecute(GuidSiteID)
48{
49Console.WriteLine("Task1:SiteID="+SiteID.ToString());
50}51
52#endregion53}54publicclassTask3:ITask
55{
56ITaskMembers#regionITaskMembers57
58publicvoidExecute(GuidSiteID)
59{
60//thrownewException("Themethodoroperationisnotimplemented.");61Console.WriteLine("Task3:SiteID="+SiteID.ToString());
62}63
64#endregion65}66publicclassTask2:ITask
67{
68ITaskMembers#regionITaskMembers69
70publicvoidExecute(GuidSiteID)
71{
72Console.WriteLine("Task2:SiteID="+SiteID.ToString());
73}74
75#endregion76}77}78
1<?xmlversion="1.0"encoding="utf-8"?>2<configuration>3<configSections>4<sectionname="Jobs"type="ConsoleApplication1.TaskConfig,ConsoleApplication1"/>5</configSections>6<Jobs>7<JobJobName="JobName1"JobTime="1"Type="ConsoleApplication1.Task1,ConsoleApplication1"></Job>8<JobJobName="JobName2"JobTime="2"Type="ConsoleApplication1.Task2,ConsoleApplication1"></Job>9<JobJobName="JobName3"JobTime="3"Type="ConsoleApplication1.Task3,ConsoleApplication1"></Job>10</Jobs>11</configuration>
完成