设为首页 收藏本站
查看: 2137|回复: 0

[经验分享] SharePoint 开发TimerJob 介绍

[复制链接]

尚未签到

发表于 2015-9-29 12:02:24 | 显示全部楼层 |阅读模式
  项目需要写TimerJob,以前也大概知道原理,不过,开发过程中,还是遇到一些问题,网上看了好多博客,也有写的灰常好的,不过,自己还是想再写一下,也算是给自己一个总结,也算给大家多一个参考吧。
  TimerJob项目结构,主要有两个Class,一个是用来定义TimerJob功能的,一个是用来部署开发好的TimerJob的,分别继承两个不同的类。如下图,先建一个如下结构的项目:
DSC0000.png
  
  文件描述:
  TimerJob定义类:ModifyTitle.cs(继承自SPJobDefinition)
  TimerJob安装类:ModifyTitleInstall.cs(继承自SPFeatureReceiver)
  激活TimerJob的Feature.xml
  添加强命名,因为将来生成的dll是要放到GAC里面去的
  
  添加引用:
  引用Microsoft.SharePoint.dll文件,两个Class都需要添加下面命名空间
  using Microsoft.SharePoint;
  using Microsoft.SharePoint.Administration;
  
  ModifyTitleInstall
  public class ModifyTitleInstall : SPFeatureReceiver
  {
  const string TimerJobName = "ModifyTitleTimerJob";//TimerJob的标题
  //激活TimerJob的方法
  public override void FeatureActivated(SPFeatureReceiverProperties properties)
  {
  SPSite site = properties.Feature.Parent as SPSite;
  foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
  {
  //如果有相同的TimerJob,先删除
  if (job.Title == TimerJobName)
  {
  job.Delete();
  }
  }
  ModifyTitle modifyTitle = new ModifyTitle(TimerJobName, site.WebApplication);
  SPMinuteSchedule minuteSchedule = new SPMinuteSchedule();//计时器对象
  minuteSchedule.BeginSecond = 0;
  minuteSchedule.EndSecond = 59;
  minuteSchedule.Interval = 1;
  modifyTitle.Schedule = minuteSchedule;
  modifyTitle.Update();
  //throw new NotImplementedException();
  }
  public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
  {
  SPSite site = properties.Feature.Parent as SPSite;
  foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
  {
  if (job.Title == TimerJobName)
  {
  job.Delete();
  }
  }
  //throw new NotImplementedException();
  }
  public override void FeatureInstalled(SPFeatureReceiverProperties properties)
  {
  //throw new NotImplementedException();
  }
  public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
  {
  //throw new NotImplementedException();
  }
  
  ModifyTitle
  public class ModifyTitle : SPJobDefinition
  {
  public ModifyTitle():base(){}
  public ModifyTitle(string TimerName, SPWebApplication webapp) : base(TimerName, webapp, null, SPJobLockType.ContentDatabase)
  {
  //TimerJob的标题
  this.Title = "定期修改Title的TimerJob";
  }
  public override void Execute(Guid targetInstanceId)
  {
  SPWebApplication webapp = this.Parent as SPWebApplication;
  SPContentDatabase contentDB=webapp.ContentDatabases[targetInstanceId];
  foreach (SPItem item in contentDB.Sites[0].RootWeb.Lists["TimerJob"].Items)
  {
  DateTime dt = Convert.ToDateTime(item["创建时间"].ToString());
  item["标题"] = "今天是这个月的第" + dt.Day.ToString() + "天";
  item.Update();
  }
  //base.Execute(targetInstanceId);
  }
  }
  
  Feature.xml(Id是需要重新生成的Guid)
  <?xml version="1.0" encoding="utf-8" ?>
  <Feature xmlns="http://schemas.microsoft.com/sharepoint/"
  Id="f0c813e8-68e0-4ad2-82cd-292b1b7222cd"
  Title="Modify Title Timer Job"
  Description="Modify Title Timer Job"
  Scope="Site"
  Hidden="TRUE"
  Version="1.0.0.0"
  ReceiverAssembly="TimerJob, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f7436af6afb9480b"
  ReceiverClass="TimerJob.ModifyTitleInstall">
  </Feature>
  
  添加结果:
DSC0001.jpg
  
  运行结果:无论标题是什么,都改成今天是这个月的第N天。
DSC0002.jpg
  
  添加配置文件:
  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
  <appSettings>
  <add key="AAString" value="http://localhost"/>
  </appSettings>
  </configuration>
  
  获取配置文件:
  string AAString = ConfigurationManager.AppSettings.Get("AAString");
  注:配置文件格式不对的话,可能造成Timer服务启动错误,所以,可以拷一个控制台程序debug下面的Consoleapp.exe.config文件,然后改成OWSTIMER.exe.config,然后放到12/bin(C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN)下就可以了
  
  部署TimerJob脚本:
  @echo off
  SET TEMPLATE="c:\program files\common files\microsoft shared\web server extensions\12\Template"
  Echo Copying files to TEMPLATES directory
  xcopy /e /y 12\TEMPLATE\* %TEMPLATE%
  Echo Copying TimerJob.dll to GAC
  "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe" -if bin\TimerJob.dll
  iisreset
  "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\bin\stsadm" -o installfeature -filename TimerJob\feature.xml -force
  "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\bin\stsadm" -o deactivatefeature -filename TimerJob\feature.xml -url http://localhost -force
  "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\bin\stsadm" -o activatefeature -filename TimerJob\feature.xml -url http://localhost -force
  net stop SPTimerV3
  net start SPTimerV3
  PAUSE
  注:新的TimerJob运行一定要重启SPTimerV3服务,在windows服务里面,如下图:
DSC0003.jpg
  调试:TimerJob程序和WebPart等SharePoint程序,运行的进程不一样,如果需要调试,需要重新安装TimerJob,然后附加到SharePoint计时器进程(下图),进行调试!
DSC0004.png
  体会:
  开发完TimerJob感觉,和SharePoint的东西有一样的特点,就是代码开发比较简单,但是杂七杂八的事情很多,部署、调试起来比较麻烦,而且非常需要细心,如果其间遇到各种bug,可以建议重启下机器(我就是头天晚上,各种报错,转天就好了)。
  还有就是,我的代码是SharePoint2007环境开发的,如果在2010或者更高版本,代码基本是类似的,注意目录即可,部署方式可能需要PowerShell,可以网上查一下。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120432-1-1.html 上篇帖子: SharePoint 2013 实现多级审批工作流 下篇帖子: SharePoint 2013 本地创建解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表