Использование синхронизации объектов Практическое занятие На занятии рассматривается синхронизация объектов между двумя системами. Предварительный этап: 1. Необходимо создать 2 области и 2 базы данных, с произвольными именами например, S1 и S2 2. В каждую область загрузить готовый проект prj1.xml и prj2.xml соответственно 3. В области S1 запустить программу GenData, создающую первоначальный набор объектов в базе S1. Таким образом, получаем начальное состояние системы. В БД S1 содержатся некоторые данные, это существующая система, и ее можно считать основной. База данных S2 – это новая система, в которой должна содержаться копия основной базы. С S2 будут работать независимо, а данные этих систем будут периодически синхронизироваться. Подготовка к синхронизации: 4. Для всех классов в 2х областях необходимо указать: Parameter OBJJOURNAL = 2; //или Parameter OBJJOURNAL=1; Parameter GUIDENABLED = 1; 5. Для существующих объектов необходимо создать глобальный идентификатор GUID, для этого необходимо выполнить: s st=##class(%Library.GUID).AssignGUID("Sync.Person",1) 6. Перекомпилируйте классы 7. Скопируйте данные в систему S2 (через экспорт глобалей) Теперь обе системы содержат одинаковый набор исходных данных. И в каждую из систем можно вносить изменения независимо. Для того, чтобы затем можно было синхронизовать объекты, необходимо создать соответствующие программы 8. Создайте программу для экспорта данных из системы S2, например, SyncOut: set DirFile="c:\sync21.dat" Set SrcSyncSet = ##class(%SYNC.SyncSet).%New() Set ExcludedDB = $ListBuild(##class(%SYS.System).InstanceGUID(),"S1") Do SrcSyncSet.AddTransactions(,,ExcludedDB) set sc=SrcSyncSet.ExportFile(DirFile,"-d") quit 9. Создайте в области S1 программу для импорта данных, например, SyncIn: Set TrgSyncSet = ##class(%SYNC.SyncSet).%New() Set St= TrgSyncSet.Import("C:\sync21.dat") 10. Добавьте новые данные в систему S2, можно использовать программу AddData. Посмотрите какие данные добавились. 11. Выполните SyncIn и SyncOut. Убедитесь, что данные были перенесены. 12. Создайте аналогичные SyncOut и SyncIn в S1 и в S2 соответственно. 13. Чтобы убедиться, что данные синхронизируются в обе стороны, можно создать данные на стороне S1, удалить или изменить какие-то из существующих объектов. Если в каждой из систем изменить один и тот же объект, а затем попытаться выполнить синхронизацию, то при загрузке возникнет конфликт. Разрешение конфликтов (дополнительное) 14. Создайте callback метод %ResolveConcurrencyConflict, который будет вызываться в случае возникновения конфликта. Можно реализовать такую функциональность, чтобы изменения, вносимые в S1, имели приоритет. Т.е. чтобы при импорте данных в S2, при возникновении конфликта существующий в S2 объект перезаписывался новым объектом из S1. Для этого можно использовать метод класса %SyncObjectIn.