Recuperando uma réplica desatualizada
O Microsoft Estrutura de sincronização compara o conhecimento esquecido da réplica de origem com o conhecimento atual da réplica de destino antes de aplicar as alterações, . Se o conhecimento de destino não contiver o conhecimento esquecido, o Estrutura de sincronização identificará a réplica de destino como desatualizada e começará uma sincronização de recuperação.
Para executar uma sincronização de recuperação, o Estrutura de sincronização realiza as seguintes etapas:
Se o aplicativo está registrado para receber notificações, o Estrutura de sincronização notificará que uma sincronização de recuperação é necessária. O aplicativo pode escolher 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 é executar a enumeração completa.
Quando o aplicativo especifica uma enumeração completa, o Estrutura de sincronização 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 Estrutura de sincronização continua a enumerar 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 aplicados como exceções de item único.
Noções básicas sobre sincronização de recuperação
Em uma comunidade de sincronização do Estrutura de sincronização, cada réplica contém metadados sobre os itens na réplica. Os metadados rastreiam informações sobre a criação, modificação e exclusão de itens armazenados na réplica. Normalmente, a réplica deve limpar os metadados para itens excluídos periodicamente para evitar a falta de espaço de armazenamento. Quando uma réplica remove metadados de um item excluído, esta não pode mais enumerar a exclusão e enviá-la como uma exclusão durante a sincronização. Contanto que todas as réplica em uma comunidade de sincronização sincronizem as exclusões antes da limpeza dos metadados, todas as exclusões são propagadas corretamente e não ocorrem problemas.
No entanto, uma réplica poderá tornar-se desatualizada se não sincronizar seus dados até que outra réplica execute a limpeza de metadados. Nesse caso, a réplica que executou a limpeza não pode enumerar as alterações que foram limpas e não pode enviá-las para a réplica desatualizada. Para se recuperar disso, quando a sincronização é feita entre uma réplica de origem que executou a limpeza de metadados e a réplica de destino desatualizada, o Estrutura de sincronização necessita 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 Estrutura de sincronização usa o conhecimento esquecido da réplica de origem para detectar quando a réplica de destino está desatualizada. Quando uma réplica remover metadados para um item excluído, esta registra a versão da exclusão no conhecimento esquecido da réplica. O conhecimento esquecido 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 estimativa 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 registrar para receber uma notificação de que uma sincronização de recuperação é necessária. Esta 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 registrou para receber esta notificação, o Estrutura de sincronização começará uma enumeração completa.
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 registra isto para receber o evento FullEnumerationNeeded. Quando este evento é gerado, o manipulador de eventos responde definindo a propriedade Action do objeto FullEnumerationNeededEventArgs para uma das seguintes ações:
Full faz o Estrutura de sincronização descartar o lote de alterações atual e começar 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 na réplica de destino.
Partial faz o Estrutura de sincronização 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 ao conhecimento adquirido são aplicadas como exceções de item único.
Abort faz o Estrutura de sincronização 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 Estrutura de sincronização chama ISyncCallback::OnFullEnumerationNeeded. Este método retorna uma das seguintes ações:
SFEA_FULL_ENUMERATION faz o Estrutura de sincronização descartar o lote de alterações atual e começar 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 na réplica de destino.
SFEA_PARTIAL_SYNC faz o Estrutura de sincronização 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 ao conhecimento adquirido são aplicadas como exceções de item único.
SFEA_ABORT faz o Estrutura de sincronização parar a sessão atual.
Enumerando completamente todas as alterações na réplica de origem
Durante uma enumeração completa, o Estrutura de sincronização exige que o provedor de origem enumere todas suas alterações. O Estrutura de sincronização compara as alterações do provedor de origem para os itens na 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, certifique-se que o provedor de origem enumera corretamente todos os itens na réplica de origem ou serão excluídos itens incorretamente da réplica de destino.
Enumerando alterações completamente usando código gerenciado
Para enumerar completamente alterações do provedor de origem, o Estrutura de sincronização chama GetFullEnumerationChangeBatch em vez de GetChangeBatch. Quando este método é chamado, o provedor de origem retorna um objeto FullEnumerationChangeBatch. Para criar este lote de alterações, siga estas etapas:
Abra um grupo ordenado usando BeginOrderedGroup. A ID de item que é usada para iniciar o grupo deve ser a primeira ID que é enumerada e deve ser menor ou igual ao limite de enumeração inferior especificado em GetFullEnumerationChangeBatch.
Como opção, adicione alterações ao lote classificado por ID de item que tem IDs de item que são menores do que o limite de enumeração inferior e que não está contido no conhecimento de destino.
Adicione alterações ao lote, classificadas por ID de item que tem IDs de item maiores que 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 este for o último lote, especifique o limite de enumeração superior como Infinity.
Quando este for o último lote, chame SetLastBatch; caso contrário, o Estrutura de sincronização chamará GetFullEnumerationChangeBatch novamente.
Enumerando alterações completamente usando código não gerenciado
Para enumerar completamente alterações do provedor de origem, o Estrutura de sincronização chama IKnowledgeSyncProvider::GetFullEnumerationChangeBatch em vez de IKnowledgeSyncProvider::GetChangeBatch. Quando este método é chamado, o provedor de origem retorna um objeto ISyncFullEnumerationChangeBatch. Para criar este 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 que é usada para iniciar o grupo deve ser a primeira ID que é enumerada e deve ser menor ou igual ao limite de enumeração inferior especificado em GetFullEnumerationChangeBatch.
Como opção, adicione alterações ao lote classificado por ID de item que tem IDs de item que são menores do que o limite de enumeração inferior e que não está contido no conhecimento de destino.
Adicione alterações ao lote, classificadas por ID de item que tem IDs de item maiores que 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 este for o último lote, especifique o limite de enumeração superior como NULL.
Quando este for o último lote, chame ISyncChangeBatchBase::SetLastBatch caso contrário, o Estrutura de sincronização chamará GetFullEnumerationChangeBatch novamente.
Processando alterações durante a sincronização de recuperação
Para determinar quais itens devem ser excluídos da réplica de destino, o Estrutura de sincronização exige que o provedor de destino enumere, em ordem classificada por ID de item, todos os itens na réplica de destino que têm ID de item entre os limites de enumeração inferiores e superiores de cada lote de alterações. Um item na réplica de destino que não tem uma alteração enumerada correspondente do provedor de origem será excluído.
O provedor de destino passa a lista de itens de destino para o aplicador de alterações. O aplicador de alteração determina como tratar cada alteração e chama o método de provedor de destino apropriado para aplicar a alteração à réplica de destino.
Processando alterações usando código gerenciado
Para processar alterações durante a sincronização de recuperação, o Estrutura de sincronização chama o método ProcessFullEnumerationChangeBatch do provedor de destino. Este método fornece um objeto FullEnumerationChangeBatch que contém as alterações do provedor de origem.
Se o provedor de destino usa o objeto NotifyingChangeApplier fornecido pelo Estrutura de sincronização, o provedor de destino deve chamar o método ApplyFullEnumerationChanges para aplicar as alterações. Este método exige uma coleção, classificada pela ID do item, de todas as alterações de destino que têm 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 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 a sincronização de recuperação, o Estrutura de sincronização chama o método IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch do provedor de destino. Este método fornece um objeto ISyncFullEnumerationChangeBatch que contém as alterações do provedor de origem.
Se o provedor de destino usa o objeto ISynchronousNotifyingChangeApplier fornecido pelo Estrutura de sincronização, o provedor de destino deve chamar o método ISynchronousNotifyingChangeApplier::ApplyFullEnumerationChanges para aplicar as alterações. Este método exige uma coleção, classificada pela ID do item, de todas as alterações de destino que têm 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 métodos Interface ISynchronousNotifyingChangeApplierTarget da mesma forma que durante uma sincronização típica.
Consulte também
Conceitos
Provedores de sincronização
Enumerando alterações
Aplicando alterações