Procedimiento para guardar y restaurar un token de cambio
Última modificación: martes, 28 de julio de 2009
Hace referencia a: SharePoint Foundation 2010
Si la aplicación consulta el registro de cambios de manera regular, se recomienda conservar el último token de cambio al final de una ejecución y posteriormente reconstruir el token conservado para usarlo como punto de partida para la ejecución siguiente. Para guardar un token de cambio, primero llame al método SPChangeToken.ToString() para obtener una representación en cadena del token. A continuación, conserve el resultado para el almacenamiento permanente. Para restaurar el token, recupere la cadena del almacenamiento y pásela al constructor SPChangeToken.SPChangeToken(String).
Precaución |
---|
Los tokens de cambio son específicos de una lista, un sitio web, una colección de sitios o una base de datos de contenido. El objeto SPChangeToken de un objeto no puede usarse en el método GetChanges de otro objeto. La única excepción a esta regla es que un objeto SPChangeToken de un objeto SPContentDatabase puede usarse en el método GetChanges para cualquier objeto que esa base de datos de contenido contenga. |
Ejemplo
El ejemplo siguiente es una aplicación de consola que consulta al registro de cambios los cambios con ámbito de base de datos de contenido.
La primera vez que se ejecuta la aplicación, la consulta recupera todos los cambios registrados desde el principio hasta el final en curso. Para realizar esta consulta, primero se establece la propiedad ChangeTokenStart de un objeto SPChangeQuery en el valor NULL y, a continuación, se pasa el objeto SPQuery al método GetChanges. Una vez procesados todos los cambios, el programa serializa el último token de cambio del último lote de cambios llamando al método ToString() y almacena el resultado en un archivo en disco.
En ejecuciones siguientes, el programa deserializa el token de cambio almacenado y lo usa para establecer la propiedad ChangeTokenStart, que define el punto inicial para su consulta frente al registro de cambios. La propiedad ChangeTokenEnd se deja en su valor NULL predeterminado, lo que señala que la consulta debe continuar hasta el final del registro.
El trabajo importante se realiza en la función GetStartingToken, que es donde se llama al constructor 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