共用方式為


復原過時複寫

在 Sync Framework 套用變更之前,它會比較來源複寫的被遺忘知識與目的地複寫的目前知識。如果目的地知識不包含被遺忘的知識,Sync Framework 會將目的地複寫識別為過時,並開始復原同步處理。

若要執行復原同步處理,Sync Framework 會採取下列步驟:

  • 如果應用程式已註冊要接收通知,Sync Framework 就會通知應用程式,需要復原同步處理。應用程式可以選擇完整列舉來源複寫中的所有項目,以執行部分同步處理,或取消同步處理。預設動作是取消同步處理。

  • 當應用程式指定完整列舉時,Sync Framework 會捨棄目前的變更批次、完整列舉來源複寫中的所有列舉,並將其套用至目的地複寫。

  • 當應用程式指定部分同步處理時,Sync Framework 會繼續列舉來源變更,並像一般同步處理中一樣套用至目的地複寫,只有學習到的知識之所有變更是以單一項目例外狀況套用。

了解復原同步處理

在 Sync Framework 同步處理社群中,每個複寫都包含有關複寫中項目的中繼資料。中繼資料會追蹤有關儲存在複寫上項目的建立、修改和刪除等資訊。一般來說,複寫必須定期清除已刪除項目的中繼資料,以避免用盡儲存空間。當複寫已移除刪除項目的中繼資料時,就不能再在同步處理期間,列舉刪除並傳送為變更。只要同步處理社群中的所有複寫在中繼資料清除之前同步處理刪除,所有刪除都會正確地進行傳播,而不會發生任何問題,

但如果複寫等到另一個複寫已執行中繼資料清除之後再同步處理其資料時,該複寫可能就會變得過時。在此情況下,已執行清除的複寫就無法再列舉已被清除的變更,因而無法將變更傳送給過時的複寫。若要化解這種狀況,在已執行中繼資料清除的來源複寫與已過時目的地複寫之間嘗試進行同步處理時,Sync Framework 需要透過復原同步處理來還原目的地複寫。需要有復原同步處理,才能防止過時複寫重新導入已從同步處理社群中刪除的項目。

Sync Framework 會使用來源複寫之被遺忘的知識,偵測目的地是否已過時。當複寫移除已刪除項目的中繼資料時,會在複寫之被遺忘的知識中記錄刪除的版本。然後,被遺忘的知識就可以用來識別複寫已經知道的項目,而且已經刪除,並將其中繼資料加以移除。請注意,被遺忘的知識是一種監督估計值,以偵測哪些項目已將中繼資料移除,因此,被遺忘的知識也可能會包含中繼資料內仍為使用中的項目。

回應復原同步處理的通知

應用程式可以透過註冊來接收需要復原同步處理的通知。這項通知讓應用程式有機會開始進行完整列舉,繼續目前的工作階段,或停止工作階段。根據預設,如果應用程式沒有註冊來接收這項通知,Sync Framework 就會停止工作階段。

使用 Managed 程式碼回應復原同步處理的通知

若要接收需要復原同步處理的通知,應用程式要實作事件處理常式,並註冊以接收 FullEnumerationNeeded 事件。當此事件引發時,事件處理常式會將 FullEnumerationNeededEventArgs 物件的 Action 屬性設定為下列其中一項動作來回應:

  • Full 會導致 Sync Framework 捨棄目前的變更批次,然後呼叫下列方法,開始進行完整列舉:

  • Partial 會導致 Sync Framework 套用目前的變更批次,並像一般同步處理一樣繼續執行工作階段,只有學習到的知識之所有變更是當做單一項目例外狀況來套用。單一項目例外狀況的效率低於一般知識表示法,所以只有在無法立即執行完整列舉時,才應該使用部分同步處理。請注意,Sync Framework 將會繼續要求在每一個同步處理開頭進行完整列舉,直到執行完整列舉為止。

  • Abort 會導致 Sync Framework 停止目前的工作階段。

使用 Unmanaged 程式碼回應復原同步處理的通知

若要接收需要復原同步處理的通知,應用程式要實作 ISyncCallback 介面,並使用 ISyncSession::RegisterCallback 註冊。復原同步處理開始之前,Sync Framework 會呼叫 ISyncCallback::OnFullEnumerationNeeded。此方法會傳回下列其中一項動作:

  • SFEA_FULL_ENUMERATION 會導致 Sync Framework 捨棄目前的變更批次,然後呼叫下列方法,開始進行完整列舉:

  • SFEA_PARTIAL_SYNC 會導致 Sync Framework 套用目前的變更批次,並像一般同步處理一樣繼續執行工作階段,只有學習到的知識之所有變更是當做單一項目例外狀況來套用。單一項目例外狀況的效率低於一般知識表示法,所以只有在無法立即執行完整列舉時,才應該使用部分同步處理。請注意,Sync Framework 將會繼續要求在每一個同步處理開頭進行完整列舉,直到執行完整列舉為止。

  • SFEA_ABORT 會導致 Sync Framework 停止目前的工作階段。

完整列舉來源複寫上的所有變更

在完整列舉期間,Sync Framework 需要來源複寫列舉所有變更,然後 Sync Framework 再比較來源提供者的變更與目的地複寫中的項目。目的地複寫中的任何項目如果沒有來源提供者的相對應變,就認定是已經從來源複寫中刪除,並將從目的地複寫中刪除。因此,務必要確保來源提供者正確列舉來源複寫中的所有項目,否則會誤將項目從目的地複寫刪除。

使用 Managed 程式碼完整列舉變更

若要完整列舉來源提供者的變更,Sync Framework 會呼叫 GetFullEnumerationChangeBatch 而不是呼叫 GetChangeBatch。呼叫此方法時,來源提供者會傳回 FullEnumerationChangeBatch 物件。若要建立此變更批次,請遵循下列步驟:

  1. 使用 BeginOrderedGroup 開啟已排序群組。用來開始群組的項目識別碼必須是列舉的第一個識別碼,而且必須小於或等於 GetFullEnumerationChangeBatch 中指定的列舉下限。

  2. 也可以選擇依項目識別碼排序,將變更加入至項目識別碼小於列舉下限及未包含於目的地知識內的批次中。

  3. 依項目識別碼排序,將變更加入至項目識別碼大於或等於列舉下限的批次中。

  4. 使用 EndOrderedGroup 關閉已排序群組。指定列舉上限為最後加入群組之變更的識別碼。當批次為最後批次時,指定列舉上限為 Infinity

  5. 當批次為最後批次時,呼叫 SetLastBatch;,否則 Sync Framework 會再次呼叫 GetFullEnumerationChangeBatch

使用 Unmanaged 程式碼完整列舉變更

若要完整列舉來源提供者的變更,Sync Framework 會呼叫 IKnowledgeSyncProvider::GetFullEnumerationChangeBatch 而不是呼叫 IKnowledgeSyncProvider::GetChangeBatch。呼叫此方法時,來源提供者會傳回 ISyncFullEnumerationChangeBatch 物件。若要建立此變更批次,請遵循下列步驟:

  1. 使用 IProviderSyncServices::CreateFullEnumerationChangeBatch 建立變更批次物件。

  2. 使用 ISyncChangeBatchBase::BeginOrderedGroup 開啟已排序群組。用來開始群組的項目識別碼必須是列舉的第一個識別碼,而且必須小於或等於 GetFullEnumerationChangeBatch 中指定的列舉下限。

  3. 也可以選擇依項目識別碼排序,將變更加入至項目識別碼小於列舉下限及未包含於目的地知識內的批次中。

  4. 依項目識別碼排序,將變更加入至項目識別碼大於或等於列舉下限的批次中。

  5. 使用 ISyncChangeBatchBase::EndOrderedGroup 關閉已排序群組。指定列舉上限為最後加入群組之變更的識別碼。當批次為最後批次時,指定列舉上限為 NULL

  6. 當批次為最後批次時,呼叫 ISyncChangeBatchBase::SetLastBatch,否則 Sync Framework 會再次呼叫 GetFullEnumerationChangeBatch

在復原同步處理期間處理變更

若要判斷哪些項目已從目的地複寫刪除,Sync Framework 需要目的地提供者依項目識別碼排序,列舉目的地複寫中項目識別碼介於各變更批次上下限之間的所有項目。目的地複寫中的項目如果沒有從來源提供者列舉的相對應變更,就會加以刪除。

目的地提供者將這份目的地項目清單傳遞給變更套用者。變更套用者決定處理各項變更的方式,然後呼叫適當的目的地提供者方法,將變更套用至目的地複寫。

使用 Managed 程式碼處理變更

若要在復原同步處理期間處理變更,Sync Framework 會呼叫目的地提供者的 ProcessFullEnumerationChangeBatch 方法。此方法會提供 FullEnumerationChangeBatch 物件,其中包含來源提供者的變更。

如果目的地提供者使用由 Sync Framework 提供的 NotifyingChangeApplier 物件,目的地提供者必須呼叫 ApplyFullEnumerationChanges 方法來套用變更。此方法需要依項目識別碼排序的所有目的地變更集合,其中的項目識別碼介於來源變更批次的 DestinationVersionEnumerationRangeLowerBoundDestinationVersionEnumerationRangeUpperBound 屬性之間。若要套用變更,NotifyingChangeApplier 物件會呼叫 INotifyingChangeApplierTarget 方法,與一般同步處理期間相同。

使用 Unmanaged 程式碼處理變更

若要在復原同步處理期間處理變更,Sync Framework 會呼叫目的地提供者的 IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch 方法。此方法會提供 ISyncFullEnumerationChangeBatch 物件,其中包含來源提供者的變更。

如果目的地提供者使用由 Sync Framework 提供的 ISynchronousNotifyingChangeApplier 物件,目的地提供者必須呼叫 ISynchronousNotifyingChangeApplier::ApplyFullEnumerationChanges 方法來套用變更。此方法需要依項目識別碼排序的所有目的地變更集合,其中的項目識別碼介於來源變更批次的 ISyncFullEnumerationChangeBatch::GetClosedLowerBoundItemIdISyncFullEnumerationChangeBatch::GetClosedUpperBoundItemId 屬性之間。若要套用變更,ISynchronousNotifyingChangeApplier 物件會呼叫 ISynchronousNotifyingChangeApplierTarget 介面 方法,與一般同步處理期間相同。

請參閱

概念

實作標準的自訂提供者
列舉變更
套用變更