Использование синхронизации объектов

advertisement
Использование синхронизации объектов
Практическое занятие
На занятии рассматривается синхронизация объектов между двумя системами.
Предварительный этап:
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.
Download