{方法] 変更トークンの保存と復元
最終更新日: 2009年7月28日
適用対象: SharePoint Foundation 2010
定期的なスケジュールに従ってアプリケーションで変更ログに対してクエリを実行する場合、実行の最後で前回の変更トークンを保持し、そのトークンを後で再構築して、次の実行の開始位置として使用できます。変更トークンを保存するには、まず SPChangeToken.ToString() メソッドを呼び出してトークンの文字列表現を取得し、結果を永続ストレージに保持します。トークンを復元するには、ストレージから文字列を取得して、それを SPChangeToken.SPChangeToken(String) コンストラクターに渡します。
注意 |
---|
変更トークンは、リスト、Web サイト、サイト コレクション、またはコンテンツ データベースに固有です。あるオブジェクトから派生した SPChangeToken オブジェクトは、別のオブジェクトの GetChanges メソッドでは使用できません。このルールの唯一の例外は、SPContentDatabase オブジェクトから派生した SPChangeToken オブジェクトが、コンテンツ データベースに含まれるすべてのオブジェクトの GetChanges メソッドで使用できるという点です。 |
例
次の例は、コンテンツ データベース範囲を持つ変更の変更ログに対してクエリを実行するコンソール アプリケーションを示しています。
アプリケーションを最初に実行すると、ログの最初から現在の末尾まで、記録されているすべての変更がクエリによって取得されます。このクエリを実行するには、SPChangeQuery オブジェクトの ChangeTokenStart プロパティを null 値に設定してから、SPQuery オブジェクトを GetChanges メソッドに渡します。すべての変更が処理されたら、プログラムによって ToString() メソッドが呼び出され、変更の最後のバッチから最後の変更トークンがシリアル化されます。そして、ディスク上のファイルに結果が格納されます。
以降の実行では、格納された変更トークンがプログラムによって逆シリアル化され、それを使用して ChangeTokenStart プロパティが設定されます。これにより、変更ログに対するクエリの開始位置が定義されます。ChangeTokenEnd プロパティは既定の null 値のままです。これは、クエリがログの最後に進む必要があることを示します。
重要な操作が GetStartingToken 関数によって行われます。ここで SPChangeToken コンストラクターが呼び出されます。
using System;
using System.IO;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace Test
{
class ConsoleApp
{
private const string DATA_FILE_PATH = "ChangeToken.dat";
static void Main(string[] args)
{
using (SPSite site = new SPSite("https://localhost"))
{
SPChangeQuery query = new SPChangeQuery(true, true);
query.ChangeTokenStart = GetStartingToken();
while (true)
{
// Get a batch of changes.
SPChangeCollection changes = site.ContentDatabase.GetChanges(query);
// Process them.
foreach (SPChange change in changes)
{
Console.WriteLine("Date: {0} Type of object: {1} Type of change: {2}",
change.Time.ToShortDateString(), change.GetType().ToString(), change.ChangeType);
}
// Starting point for next batch.
query.ChangeTokenStart = changes.LastChangeToken;
// If this is the last batch, exit.
if (changes.Count < query.FetchLimit)
break;
}
// Serialize the last token as a starting point for the next run.
SaveLastToken(query.ChangeTokenStart);
}
Console.Write("\nPress ENTER to continue...");
Console.ReadLine();
}
static SPChangeToken GetStartingToken()
{
// Passing a null token to GetChanges fetches
// changes from the start of the log.
SPChangeToken token = null;
// If we have a token from the last run, use it.
if (File.Exists(DATA_FILE_PATH))
{
using (FileStream fs = File.OpenRead(DATA_FILE_PATH))
{
BinaryReader br = new BinaryReader(fs);
try
{
string str = br.ReadString();
// Construct a change token from serialized string.
token = new SPChangeToken(str);
}
catch (EndOfStreamException e)
{
// No serialized string, so do nothing.
}
finally
{
br.Close();
}
}
}
return token;
}
static void SaveLastToken(SPChangeToken token)
{
using (FileStream fs = File.Create(DATA_FILE_PATH))
{
// Serialize the token.
BinaryWriter bw = new BinaryWriter(fs);
string s = token.ToString();
bw.Write(s);
// Flush and close.
bw.Flush();
bw.Close();
}
}
}
}
Imports System
Imports System.IO
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Administration
Module ConsoleApp
Private Const DATA_FILE_PATH As String = "ChangeToken.dat"
Sub Main()
Using site As SPSite = New SPSite("https://localhost")
Dim query As New SPChangeQuery(True, True)
query.ChangeTokenStart = GetStartingToken()
While (True)
' Get a batch of changes.
Dim changes As SPChangeCollection = site.ContentDatabase.GetChanges(query)
' Process them.
For Each change As SPChange In changes
Console.WriteLine("Date: {0} Type of object: {1} Type of change: {2}", _
change.Time.ToShortDateString(), change.GetType().ToString(), change.ChangeType)
Next
' This is the starting point for next batch.
query.ChangeTokenStart = changes.LastChangeToken
' If this is the last batch, exit.
If changes.Count < query.FetchLimit Then
Exit While
End If
End While
' Serialize the last token as a starting point for the next run.
SaveLastToken(query.ChangeTokenStart)
End Using
Console.Write(vbCrLf + "Press ENTER to continue...")
Console.ReadLine()
End Sub
Function GetStartingToken() As SPChangeToken
' Passing a null token to GetChanges fetches
' changes from the start of the log.
Dim token As SPChangeToken = Nothing
' If we have a token from the last run, use it.
If File.Exists(DATA_FILE_PATH) Then
Using fs As FileStream = File.OpenRead(DATA_FILE_PATH)
Dim br As BinaryReader = New BinaryReader(fs)
Try
Dim str As String = br.ReadString()
' Construct a change token from serialized string.
token = New SPChangeToken(str)
Catch e As EndOfStreamException
' No serialized string, so do nothing.
Finally
br.Close()
End Try
End Using
End If
Return token
End Function
Sub SaveLastToken(ByRef token As SPChangeToken)
Using fs As FileStream = File.Create(DATA_FILE_PATH)
' Serialize the token.
Dim bw As BinaryWriter = New BinaryWriter(fs)
Dim s As String = token.ToString()
bw.Write(s)
' Flush and close.
bw.Flush()
bw.Close()
End Using
End Sub
End Module