Recuperando uma réplica desatualizada
Antes de aplicar as alterações, o Sync Framework compara o conhecimento esquecido da réplica de origem com o conhecimento atual da réplica de destino. Se o conhecimento de destino não contiver o conhecimento esquecido, o Sync Framework identificará a réplica de destino como desatualizada e iniciará uma sincronização de recuperação.
Para executar uma sincronização de recuperação, o Sync Framework executa as seguintes etapas:
Se o aplicativo estiver registrado para receber notificação, o Sync Framework notificará que uma sincronização de recuperação é necessária. O aplicativo pode optar por enumerar completamente todos os itens na réplica de origem, executar uma sincronização parcial ou cancelar a sincronização. A ação padrão é cancelar a sincronização.
Quando o aplicativo especifica uma enumeração completa, o Sync Framework descarta o lote de alterações atual, enumera completamente todos os itens na réplica de origem e os aplica à réplica de destino.
Quando o aplicativo especifica uma sincronização parcial, o Sync Framework continua a enumerar as alterações de origem e a aplicá-las à réplica de destino como em uma sincronização típica, exceto que as alterações ao conhecimento adquirido são aplicadas como exceções de item único.
Noções básicas sobre sincronização de recuperação
Em uma comunidade de sincronização do Sync Framework, cada réplica contém metadados sobre os itens da réplica. Os metadados rastreiam informações sobre a criação, modificação e exclusão de itens armazenados na réplica. Normalmente, uma réplica deve limpar periodicamente os metadados de itens excluídos para evitar a falta de espaço de armazenamento. Quando uma réplica tiver removido metadados de um item excluído, ela não poderá mais enumerar a exclusão e enviá-la como uma alteração durante a sincronização. Desde que todas as réplica de uma comunidade de sincronização sincronizem as exclusões antes da limpeza dos metadados, todas as exclusões serão propagadas corretamente e não ocorrerão problemas.
No entanto, uma réplica poderá ficar desatualizada se não sincronizar seus dados até que outra réplica tenha executado a limpeza de metadados. Nesse caso, a réplica que executou a limpeza não poderá mais enumerar as alterações que foram limpas nem enviá-las para a réplica desatualizada. Para se recuperar disso, quando é tentada a sincronização entre uma réplica de origem que executou a limpeza de metadados e uma réplica de destino desatualizada, o Sync Framework requer que a réplica de destino seja restaurada usando a sincronização de recuperação. A sincronização de recuperação é necessária para evitar que a réplica desatualizada reintroduza um item que foi excluído da comunidade de sincronização.
O Sync Framework usa o conhecimento esquecido da réplica de origem para detectar quando a réplica de destino está desatualizada. Quando uma réplica remove metadados de um item excluído, ela registra a versão da exclusão no conhecimento esquecido da réplica. Esse conhecimento poderá ser usado para identificar itens que eram conhecidos pela réplica, que foram excluídos e que tiveram seus metadados removidos. Lembre-se de que o conhecimento esquecido é uma superestimativa de quais itens tiveram seus metadados removidos. Portanto, o conhecimento esquecido também pode conter itens que ainda têm entradas ativas nos metadados.
Respondendo a notificação de uma sincronização de recuperação
Um aplicativo pode se registrar para receber uma notificação de que uma sincronização de recuperação é necessária. Essa notificação dá ao aplicativo a oportunidade para iniciar uma enumeração completa, continuar com a sessão atual ou parar a sessão. Por padrão, se o aplicativo não tiver se registrado para receber essa notificação, o Sync Framework interromperá a sessão.
Respondendo a notificação de uma sincronização de recuperação usando código gerenciado
Para receber uma notificação de que uma sincronização de recuperação é necessária, o aplicativo implementa um manipulador de eventos e o registra para receber o evento FullEnumerationNeeded. Quando esse evento é gerado, o manipulador de eventos responde definindo a propriedade Action do objeto FullEnumerationNeededEventArgs para uma das seguintes ações:
Full faz o Sync Framework descartar o lote de alterações atual e iniciar uma enumeração completa chamando os seguintes métodos:
O método GetFullEnumerationChangeBatch para enumerar todas as alterações de item da réplica de origem.
O método ProcessFullEnumerationChangeBatch para aplicar as alterações à réplica de destino.
Partial faz o Sync Framework aplicar o lote de alterações atual e continuar com a sessão como em uma sincronização típica, exceto que todas as alterações do conhecimento adquirido são aplicadas como exceções de item único. As exceções de item único são menos eficientes do que a representação de conhecimento típica, assim a sincronização parcial só deve ser usada quando uma enumeração completa não puder ser executada imediatamente. Esteja ciente de que o Sync Framework continuará solicitando uma enumeração completa no início de cada sincronização, até que uma enumeração completa seja executada.
Abort faz o Sync Framework parar a sessão atual.
Respondendo a notificação de uma sincronização de recuperação usando código não gerenciado
Para receber uma notificação de que uma sincronização de recuperação é necessária, o aplicativo implementa a interface ISyncCallback e a registra usando ISyncSession::RegisterCallback. Antes de uma sincronização de recuperação começar, o Sync Framework chama ISyncCallback::OnFullEnumerationNeeded. Esse método retorna uma das seguintes ações:
SFEA_FULL_ENUMERATION faz o Sync Framework descartar o lote de alterações atual e iniciar uma enumeração completa chamando os seguintes métodos:
O método IKnowledgeSyncProvider::GetFullEnumerationChangeBatch para enumerar todas as alterações de item da réplica de origem.
O método IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch para aplicar as alterações à réplica de destino.
SFEA_PARTIAL_SYNC faz o Sync Framework aplicar o lote de alterações atual e continuar com a sessão como em uma sincronização típica, exceto que todas as alterações do conhecimento adquirido são aplicadas como exceções de item único. As exceções de item único são menos eficientes do que a representação de conhecimento típica, assim a sincronização parcial só deve ser usada quando uma enumeração completa não puder ser executada imediatamente. Esteja ciente de que o Sync Framework continuará solicitando uma enumeração completa no início de cada sincronização, até que uma enumeração completa seja executada.
SFEA_ABORT faz o Sync Framework parar a sessão atual.
Enumerando completamente todas as alterações na réplica de origem
Durante uma enumeração completa, o Sync Framework requer que o provedor de origem enumere todas suas alterações. O Sync Framework compara as alterações do provedor de origem com os itens da réplica de destino. Presume-se que qualquer item na réplica de destino que não tenha uma alteração correspondente do provedor de origem possa ter sido excluído da réplica de origem e será excluído da réplica de destino. Por causa disso, verifique se o provedor de origem enumera corretamente todos os itens na réplica de origem ou os itens serão excluídos incorretamente da réplica de destino.
Enumerando alterações completamente usando código gerenciado
Para enumerar completamente as alterações do provedor de origem, o Sync Framework chama GetFullEnumerationChangeBatch em vez de GetChangeBatch. Quando esse método é chamado, o provedor de origem retorna um objeto FullEnumerationChangeBatch. Para criar esse lote de alterações, siga estas etapas:
Abra um grupo ordenado usando BeginOrderedGroup. A ID de item usada para iniciar o grupo deve ser a primeira enumerada e deve ser menor ou igual ao limite de enumeração inferior especificado em GetFullEnumerationChangeBatch.
Como opção, adicione alterações ao lote, classificadas por ID de item, com IDs de item menores do que o limite de enumeração inferior e que não estejam contidas no conhecimento de destino.
Adicione alterações ao lote, classificadas por ID de item, com IDs de item maiores ou iguais ao limite de enumeração inferior.
Feche o grupo ordenado usando EndOrderedGroup. Especifique o limite de enumeração superior como a ID da última alteração que foi adicionada ao grupo. Quando for o último lote, especifique o limite de enumeração superior como Infinity.
Quando for o último lote, chame [M:Microsoft.Synchronization.ChangeBatchBase.SetLastBatch;] caso contrário, o Sync Framework chamará GetFullEnumerationChangeBatch novamente.
Enumerando alterações completamente usando código não gerenciado
Para enumerar completamente as alterações do provedor de origem, o Sync Framework chama IKnowledgeSyncProvider::GetFullEnumerationChangeBatch em vez de IKnowledgeSyncProvider::GetChangeBatch. Quando esse método é chamado, o provedor de origem retorna um objeto ISyncFullEnumerationChangeBatch. Para criar esse lote de alterações, siga estas etapas:
Crie o objeto de lote de alterações usando IProviderSyncServices::CreateFullEnumerationChangeBatch.
Abra um grupo ordenado usando ISyncChangeBatchBase::BeginOrderedGroup. A ID de item usada para iniciar o grupo deve ser a primeira ID enumerada e deve ser menor ou igual ao limite de enumeração inferior especificado em GetFullEnumerationChangeBatch.
Como opção, adicione alterações ao lote, classificadas por ID de item, com IDs de item menores do que o limite de enumeração inferior e que não estejam contidas no conhecimento de destino.
Adicione alterações ao lote, classificadas por ID de item, com IDs de item maiores ou iguais ao limite de enumeração inferior.
Feche o grupo ordenado usando ISyncChangeBatchBase::EndOrderedGroup. Especifique o limite de enumeração superior como a ID da última alteração que foi adicionada ao grupo. Quando for o último lote, especifique o limite de enumeração superior como NULL.
Quando for o último lote, chame ISyncChangeBatchBase::SetLastBatch; caso contrário, o Sync Framework chamará GetFullEnumerationChangeBatch novamente.
Processando alterações durante uma sincronização de recuperação
Para determinar quais itens devem ser excluídos da réplica de destino, o Sync Framework requer que o provedor de destino enumere, em ordem de classificação por ID, todos os itens da réplica de destino cujo ID esteja entre os limites de enumeração inferior e superior de cada lote de alterações. Um item da réplica de destino que não tenha uma alteração correspondente enumerada do provedor de origem será excluído.
O provedor de destino passa essa lista de itens de destino para o aplicador de alterações. Esse aplicador determina como manipular cada alteração e chama o método adequado do provedor de destino para aplicar a alteração à réplica de destino.
Processando alterações usando código gerenciado
Para processar alterações durante uma sincronização de recuperação, o Sync Framework chama o método ProcessFullEnumerationChangeBatch do provedor de destino. Esse método fornece um objeto FullEnumerationChangeBatch que contém as alterações do provedor de origem.
Se o provedor de destino usar o objeto NotifyingChangeApplier fornecido pelo Sync Framework, o provedor de destino deverá chamar o método ApplyFullEnumerationChanges para aplicar as alterações. Esse método requer uma coleção, classificada pela ID de item, de todas as alterações de destino que tenham IDs de item entre as propriedades DestinationVersionEnumerationRangeLowerBound e DestinationVersionEnumerationRangeUpperBound do lote de alterações de origem. Para aplicar as alterações, o objeto NotifyingChangeApplier chama os métodos INotifyingChangeApplierTarget da mesma forma que durante uma sincronização típica.
Processando alterações usando código não gerenciado
Para processar alterações durante uma sincronização de recuperação, o Sync Framework chama o método IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch do provedor de destino. Esse método fornece um objeto ISyncFullEnumerationChangeBatch que contém as alterações do provedor de origem.
Se o provedor de destino usar o objeto ISynchronousNotifyingChangeApplier fornecido pelo Sync Framework, o provedor de destino deverá chamar o método ISynchronousNotifyingChangeApplier::ApplyFullEnumerationChanges para aplicar as alterações. Esse método requer uma coleção, classificada por ID de item, de todas as alterações de destino que tenham IDs de item entre as propriedades ISyncFullEnumerationChangeBatch::GetClosedLowerBoundItemId e ISyncFullEnumerationChangeBatch::GetClosedUpperBoundItemId do lote de alterações de origem. Para aplicar as alterações, o objeto ISynchronousNotifyingChangeApplier chama os métodos Interface ISynchronousNotifyingChangeApplierTarget da mesma forma que durante uma sincronização típica.