次の方法で共有


{方法] 変更トークンの保存と復元

最終更新日: 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

関連項目

参照

SPChangeToken

SPChangeTokenCollection