繁体   English   中英

TimerJob共享点服务器2013

[英]TimerJob sharepoint server 2013

在sharepoint中,所有具有Status列(数据类型为Dropdown)和Duedate列的列表。 应更改的到期日期列今天的状态列应使用Timerjob自动关闭。我使用了此代码,但无法正常工作,请有人修改此代码以及如何实现此解决方案。

class.cs

namespace TimerJobNew
{
    class StatusCompleted : SPJobDefinition

    {
         public const string jobName = "CompletedProjectsJob";
        public StatusCompleted() : base() { }
        public StatusCompleted(SPWebApplication webApplication)
            : base(jobName, webApplication, null,SPJobLockType.Job)
        {
            Title = "Completed Projects Job";
        }
        public override void Execute(Guid targetInstanceId)
        {
            SPWebApplication webApp = this.Parent as SPWebApplication;
            SPSite site = new SPSite(SPContext.Current.Web.Url);
            SPWeb web = site.RootWeb;
           // SPWeb web = webApp.Sites["/sites/test"].RootWeb;
            SPList list = web.Lists.TryGetList("CommonList");
            SPListItem items;
            bool flag =true;
            SPListItemCollection itemColl = list.Items;
            var query =new SPSiteDataQuery();
            query.Lists = "<Lists BaseType='0' />";
            query.ViewFields = "<FieldRef Name='Title' Nullable='TRUE' />" +
                               "<FieldRef Name='Status' Nullable='TRUE' />" +
                               "<FieldRef Name='CommonlistID' Nullable='TRUE' />";

            query.Query = "<Where>" +
                                "<Eq>" +
                                    "<FieldRef Name='Status' />" +
                                    "<Value Type='Choice'>Closed</Value>" +
                                "</Eq>" +
                           "</Where>";
            query.Webs = "<Webs Scope='SiteCollection' />";
            DataTable dt = web.GetSiteData(query);
            foreach (DataRow row in dt.Rows)
            {
                items = list.Items.Add();
                if (itemColl.Count != 0)
                {
                    foreach (SPListItem item in itemColl)
                    {
                        if (item["CommonlistID"].ToString() == row["CommonlistID"].ToString())
                        {
                            flag = false;
                            break;
                        }
                        else
                        {
                            flag = true;
                        }
                    }
                    if (flag ==true)
                    {
                        items["Title"] = row["Title"].ToString();
                        items["Status"] = row["Status"].ToString();
                        items["CommonlistID"] = row["CommonlistID"];
                        items.Update();
                        list.Update();
                    }
                }
                else
                {
                    items["Title"] = row["Title"].ToString();
                    items["Status"] = row["Status"].ToString();
                    items["CommonlistID"] = row["CommonlistID"];
                    items.Update();
                    list.Update();
                }
            }
        }
    }
}


     [Guid("95a2f297-4d46-45b2-b792-a7874f11ce08")]
    public class StatusFeatureEventReceiver : SPFeatureReceiver
    {
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
            DeleteJob(webApp.JobDefinitions);
            StatusCompleted tasksTimerJob = new StatusCompleted(webApp);
            SPMinuteSchedule schedule = new SPMinuteSchedule();
            schedule.BeginSecond = 0;
            schedule.EndSecond = 59;
            schedule.Interval = 1;
            tasksTimerJob.Schedule = schedule;
            tasksTimerJob.Update();
        }       
        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
            DeleteJob(webApp.JobDefinitions);
        }
        private void DeleteJob(SPJobDefinitionCollection jobs)
        {
            foreach (SPJobDefinition job in jobs)
            {
                if (job.Name.Equals(StatusCompleted.jobName,
                StringComparison.OrdinalIgnoreCase))
                {
                    job.Delete();
                }
            }
        }
    }
}

如评论所述,由于使用SPTimerJob时SPContext为null,因此您的代码将永远无法工作。 (请注意,EventReceiver也是一样的)

您可以增强作业的构造函数以检索更多信息。 因此,您可以这样做:

public StatusCompleted(SPWebApplication webApplication, string TargetSite)
        : base(jobName, webApplication, null,SPJobLockType.Job)
{
    Title = "Completed Projects Job";
    Properties.Add("TargetSite", TargetSite);
}

然后,当您调用Execute()方法时,您可以检索该站点:

string targetList = (this.Properties["TargetList"] ?? string.Empty).ToString();
using (SPSite site = new SPSite(targetSite))
{
   using (SPWeb web = site.OpenWeb())
   {
   //TO DO
   }
}

希望这可以帮助

最后,不要忘记调试TimerJob。 查找错误将非常有用。 您只需要将Visual Studio附加到进程OWSTIMER.exe。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM