カスタムタイマージョブでSPECIFC SPWEBオブジェクトへの参照を取得するにはどうすればよいですか?
-
16-10-2019 - |
質問
SharePoint 2010のインストールで、外部ソースから特定のWebの特定のリストにデータをインポートするカスタムタイマージョブがあります。それが、ジョブは1つのWeb上の1つのリストにのみ関連しています。
私はそのウェブ(したがってリスト)への参照を取得する時間の悪魔を持っています SPJobDefinition
クラス。
サイトのパスをハードコードして、新しいSpsite( "someurl")コマンドでそれを取得することができますが、何らかの形でジョブのコンテキストからそれを取得したいので、開発、テスト、生産環境でシームレスに動作します。 。
私はサイトのガイドを渡してみました SPEventreceiver
それは仕事をスケジュールしますが、私のときはいつでも SPJobDefinition
オブジェクトが作成されたオブジェクトは、私が使用したものの代わりにパラメーターのないコンストラクターを使用しているようです SPEventReciever.FeatureActivated
ハンドラ。
だから、私の質問はこれです:
内部からSPWEBオブジェクト(またはSPSITEオブジェクト)への参照を取得するにはどうすればよいですか SPJobDefinition.Execute()
方法?
解決
Webアプリケーションスコープタイマージョブを作成したと思います。そうでない場合は、それをしたいかもしれません。見る 参照 (ステップ2、弾丸番号7)
次に、ステップ2、上記のリンクの弾丸項目10で説明されているように、次のようなコードを書くことができます。
public override void Execute(Guid targetInstanceId)
{
// Execute the timer job logic.
SPWebApplication webApp = this.Parent as SPWebApplication;
SPList taskList = webApp.Sites[0].RootWeb.Lists["Tasks"];
}
更新:それに加えて、Featureactivatedイベントでは、機能がアクティブ化されているサイトコレクション(またはサイト)にタイマージョブが機能するリストがあるかどうかを確認することができます。はいの場合、Webアプリケーションのスコープタイマージョブのインスタンスのみを作成します。
他のヒント
SPWEBまたは文字列URLを使用するコンストラクターをジョブに持っていて、Web URLとリストを保存し、ジョブ上の永続的なプロパティとして必要な他のプロパティをリストします。
タイマージョブをインストールするためにWebスコープ機能を作成し、Web IDがタックされている名前で作成することをお勧めします(複数のWebでジョブが必要な場合に備えて)。機能アクティブ化されたイベントには、ジョブのコンストラクターに渡すことができるように、そのすべてのプロパティがそこにあります。
まさにこれの詳細については、私のブログ投稿をご覧ください。http://spmonkeypoint.wordpress.com/2011/11/14/custom-sharepoint-2010-timer-job
その投稿のコードリストは次のとおりです。
using System;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace MonkeyPoints.TimerJobs
{
[Guid("6DD003C3-2861-4F63-B974-D2653E713A74")]
public class CustomTimerJob : SPJobDefinition
{
[Persisted]
public string WebUrl;
[Persisted]
public string ListUrl;
public CustomTimerJob() : base() { }
public CustomTimerJob(SPWeb web, string listUrl) : this(JobName(web), web, listUrl) { }
public CustomTimerJob(string jobName, SPWeb web, string listUrl)
: base(jobName, web.Site.WebApplication, null, SPJobLockType.Job)
{
this.WebUrl = web.Url;
this.ListUrl = listUrl;
}
protected static string JobName(SPWeb web)
{
return "CustomTimerJob_" + web.ID;
}
protected override bool HasAdditionalUpdateAccess()
{
return true;
}
public override void Execute(Guid targetInstanceId)
{
try
{
using (var site = new SPSite(WebUrl))
using (var web = site.OpenWeb())
{
// process whatever you need to on this list
}
}
catch (Exception ex)
{
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory(this.Name, TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
}
}
public static void Install(SPWeb web, string listUrl, SPSchedule schedule)
{
using (SPSite site = new SPSite(web.Site.ID, web.Site.SystemAccount.UserToken))
using (SPWeb eweb = site.OpenWeb(web.ID))
{
site.AllowUnsafeUpdates = true;
eweb.AllowUnsafeUpdates = true;
Uninstall(eweb);
var syncJob = new CustomTimerJob(eweb, listUrl);
syncJob.Schedule = schedule;
syncJob.Update();
}
}
public static void Uninstall(SPWeb web)
{
var jobName = JobName(web);
foreach (SPJobDefinition job in web.Site.WebApplication.JobDefinitions)
{
if (job.Name == jobName)
job.Delete();
}
}
public static void RunNow(string webUrl, string listUrl)
{
using (SPSite site = new SPSite(webUrl))
using (SPWeb web = site.OpenWeb())
{
var job = new CustomTimerJob(web, listUrl);
job.Execute(Guid.Empty);
}
}
}
}
Webアプリケーションに対して設定を構成するためのページを作成し、Webアプリの設定を使用して、使用するSPWEBを制御できます。
これを行うには、アプリケーションページをSharePointに展開します。それをCentral Adminで利用できるようにします(おそらくWebApplicationSelectorコントロールを使用して、どのWebアプリを設定するかを選択します)。
(Central Adminでこれを行う理由は、Webアプリケーションのプロパティを更新するには、構成データベースへの書き込みアクセスが必要であり、構成に応じてCentral Adminでのみこれを持っている可能性があるためです)
次に、あなたのために「保存」ポストバックで新しいものを持っているでしょう。
protected WebApplicationSelector _selector = ...
public void SaveIt() {
SPWebAppliction webApp = _selector.CurrentItem;
webApp.Properties["MyWeb"] = "SomeValue";
webApp.Update();
}
次に、タイマージョブでは、Webアプリケーションのプロパティにアクセスし、必要な値を読むことができるはずです。
TimerJobコードでは、コンテキストWebアプリのすべてのサイトコレクションを反復し、(サーバー相対)URLをSPWEBに保持するルートウェブ上のカスタムプロパティバッグアイテムの存在(これを自分で追加する必要がある)を確認できます。そのサイトコレクションで。