需要写一个自定义的sharepoint timer job, 目的是要定时到Site Collection Images这个List里检查图片的过期日期,如果即将过期的话,需要发送email到相关的人员。

GOOGLE了一下,发现资料很少。不过幸运的是我发现了 Andrew Connell的博客,上面有一个很详细的示例代码。http://www.andrewconnell.com/blog/articles/CreatingCustomSharePointTimerJobs.aspx

代码的基本思路是:我们的自定义job类需要从SPJobDefinition继承过来,并且要改写几个构造体和一个Execute方法。其中不带参数的默认构造体是必须的。

那么在Execute方法中怎么得到这个SPWebApplication对象呢?AC用了如下的代码:

SPWebApplication webApplication = this.Parent as SPWebApplication;

用Parent属性并且CAST成WebApplication对象, 这段我比较困扰,因为根据SDK里的说明,本来就有一个WebApplication属性可以用,为什么还要这么麻烦呢。我试了如下代码

SPWebApplication webApplication = this.WebApplication;

测试结果发现完全等效。

好,这个类写完以后,我们还要写另外一个SPFeatureReceiver类。因为我们需要一个Feature来把我们的Timer部署到服务器上去,通过Feature Activated/deactivated来触发/关闭这个TimerJob。

public overridevoid FeatureActivated(SPFeatureReceiverProperties properties)

{

SPSite site = properties.Feature.Parentas SPSite;

SPWeb web = site.RootWeb;

// make sure the job isn't already registered

foreach (SPJobDefinition jobin site.WebApplication.JobDefinitions)

{

if (job.Name == "ImageValidationCheckerJob")

{

job.Delete();

}

}

// install the job

ImageValidationCheckerJob imageValidationCheckerJob =new ImageValidationCheckerJob("ImageValidationCheckerJob", site.WebApplication);

SPDailySchedule schedule = new SPMonthlySchedule();

schedule.BeginHour = 23;

schedule.BeginMinute = 40;

schedule.BeginSecond = 1;

schedule.EndHour = 23;

schedule.EndMinute = 59;

schedule.EndSecond = 1;

imageValidationCheckerJob.Schedule = schedule;

imageValidationCheckerJob.Update();

}

public overridevoid FeatureDeactivating(SPFeatureReceiverProperties properties)

{

SPSite site = properties.Feature.Parentas SPSite;

// delete the job

foreach (SPJobDefinition jobin site.WebApplication.JobDefinitions)

{

if (job.Name == "ImageValidationCheckerJob")

{

job.Delete();

}

}

}

这个SPDailySchedule对象让我有些困扰,我现在理解是你要给定开始时间和结束时间,然后系统会随机算出一个在两者中间的时刻来启动这个工作。比如上面例子,那么每天运行时间应该是介于23:40:1 到23:59:1 之间, 不知道是不是这样,不过我猜测应该是如此。

代码写完了以后,还要写一个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这个程序,走以下步骤:(有些步骤有时候可能不用,但是全用可以保证没有问题,这个是我花了1天的时间得出的血的教训)

(为了调试方面,把Schedule设置为SPMinuteSchedule,并且设置为每2分钟运行一次)

  1. 把Assembly DLL放到 GAC
  2. 命令行:iisreset
  3. 先Deactivate feature, 然后activate feature.
  4. 命令行:net stop SPTimerV3
  5. 命令行:net start SPTimerV3
  6. Visual Studio: Attach to process: OWSTIMER.EXE
  7. 完。

还有一点要注意的是,如果你想在TimerJob类里面要从web.config文件得到一些值得话,我觉得是不可能的,至少我还没有发现该怎么做,所以,假如代码需要从外部取得一些信息的话,

解决办法是 :在 c:/program files/common files/microsoft shared/…/12/bin目录里新建一个文件,文件名叫做:OwsTimer.exe.config,

<configuration>

<appSettings>

<add key="YourKey" value="YourValue" />

</appSettings>

</configuration>

然后用ConfigurationManager.AppSettings.Get("YourKey"); 来取得这个值。

记住每次修改代码以后进行调试前,一定要走上面说的步骤,特别是步骤4和5很容易被忘记,不然可能会遇到很莫名其妙的问题。

最后,happy SharePointING。

一个SharePoint定时器 (SPJobDefinition)的更多相关文章

  1. 如何Recycle一个SharePoint Web Application,以及为什么

    当你发现SharePoint服务器的CPU或者内存使用率居高不下的时候,很多人都会选择iisreset来让资源使用率降下来.但是在企业环境中,这毫无疑问会使这台服务器中断服务从而影响到用户的使用,所以 ...

  2. 一个JS定时器类

    学习js,因为函数和定时器直接的关系是非绑定的.我不能说我开启一个定时,然后拿一个变量去记录这个setInterval的返回值,这样很麻烦. 本着面向对象的思想,利用业余时间(周末在家里)写了一个类, ...

  3. 使用boost的deadline_timer实现一个异步定时器

    概述 最近在工作上需要用到定时器,然后看到boost里面的deadline_timer可以实现一个定时器,所以就直接将其封装成了ATimer类,方便使用,ATimer有以下优点: 可以支持纳秒.毫秒. ...

  4. 一个java定时器框架

    ScheduleIterator接口 import java.util.Date; public interface ScheduleIterator {    public Date next(); ...

  5. 第一个SharePoint Add-in工程

    一.创建SharePoint hosted 工程 1.创建承载SharePoint Add-in独立域 首先,确定承载的应用程序的独立域名,可以使用类似这样的域名apps.contoso.com,鉴于 ...

  6. SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。

    一个sharepoint 2013的普通的列表的自定义新建页面,我在其中新添加几行javascript代码后页面就打不开了.如图所示: 真是一言不合,友谊的页面说打不开就打不开啊.后来慢慢比对发现是因 ...

  7. 在SharePoint中无代码开发InfoPath应用: 一个测试Web Service的工具

    这是这个系列的第一篇,介绍一个小工具,主要是用在Web Service测试的. 因为为了用一点高级的东西,就免不了和web service打交道. 你可以使用按照KB819267来修改web.conf ...

  8. C 实现一个跨平台的定时器 论述

    引言 今天我们要讲述和构建的是一个跨平台多线程C的定时器对象,粒度是毫秒级别.可以称之为简易的timer, sctimer.h 库. 首先看总的接口,看门见客. sctimer.h #ifndef _ ...

  9. SharePoint REST API - 使用REST API和jQuery上传一个文件

    博客地址:http://blog.csdn.net/FoxDave 本篇主要通过两个代码示例来展示如何应用REST API和jQuery上传文件到SharePoint. 示例会使用REST接口和j ...

随机推荐

  1. css知识

    margin和padding是什么意思 margin外边距,padding内边距,外边距表示一个元素的边到相邻元素的距离,内边距表示元素之间的内容和元素边框的距离. font:12px/1.5 表示什 ...

  2. 写出优美代码的两个方式:一步到位VS迭代优化

    最近把手头这个安卓APP的所有事务性方法都写完了,有了以下体会,新手体会,老鸟轻拍   想写成优美代码的人一般都会有这样的想法: 一定要在写每一句代码,写每一个方法,构造每一个类的时候,都要记得优化: ...

  3. Linux平台Qt creator报错:Circular all <- first dependency dropped

    在Linux下安装好Qt 5.0之后,使用Qt Creator创建了一个基于QMainWindow的框架程序.原本应该可以顺利的完成编译工作,因为自带的模板工程没有经过任何修改.可是在编译整个工程的时 ...

  4. JavaScript基础概念

    1.JavaScript在浏览器中是解释执行的: 2.JavaScript是一中弱类型的语言,在使用变量前,可以不用先申明: 3.JavaScript使用了对象对象程序设计思想: 4.JavaScri ...

  5. 数组(Array)的使用方法

    本文内容:        1.概述         2.数组基础         3.结合for循环与arr.length,在数组尾部插入数值         4.利用'concat','join'实 ...

  6. Equeue初识

    详细解说: http://www.cnblogs.com/netfocus/p/3595410.html 简单代码用法: Producer 端代码用法实例 和 Customer 端代码用法示例: ht ...

  7. sql联合查询去除重复计算总和

    1.首先来个联合查询 SELECT 字段1, 字段2, 字段3, 字段4 FROM 表1 INNER JOIN 表2 ON 表1.字段x = 表2.字段x x:代表随意的一个,只要在联合查询的两张表都 ...

  8. Jquery 前端模版

    <div id="div_demo"></div><script id="demo" type="text/x-jque ...

  9. MySQL联接操作

    在MySQL中,联接是一种对表的引用, 多表联接类型: 1.笛卡尔积(交叉联接):在MySQL中为CROSS JOIN或省略JOIN,如: select * from course, teachcou ...

  10. JPHP试用笔记

    JPHP试用指南 编译 环境准备 有JDK 1.6 的环境 Gradle 1.4 以上 具体配置略过,git签出https://github.com/dim-s/jphp/代码后,看readme.md ...