Настройка репликации в Microsoft Dynamics Mobile.
Репликация в MDM позволяет синхронизировать базу данных в мобильном терминале с базой данных на сервере. Это выглядит так: при запуске стандартной процедуры синхронизации с мобильного терминала запускается сервис синхронизации базы данных. В результате все накопленные изменения в центральной базе данных скачиваются на мобильный терминал, а все изменения в базе данных мобильного терминала скачиваются в центральную базу данных.
Пару слов о том, почему вообще понадобилось использовать такой непростой механизм как репликация. Дело в том, что основная концепция Microsoft Dynamics Mobile подразумевает работу мобильного устройства в полностью автономном режиме.
Пользователи мобильного устройства, например, в металлургии могут в момент работы выйти за пределы устойчивого приема WiFi или GPRS сети или вообще работать долгое время без доступа к центральному серверу периодически возвращаясь в конторку, где мобильное устройство будет воткнуто в кредл и получит доступ к сети. Это автоматически означает, что устройство должно иметь абсолютную автономию. А значит иметь доступ к необходимым для работы справочникам, и настройкам.
При этом поддержка репликации дополняет основной механизм посылки XML документов т.к. XML очереди лучше справляются с разрешением возникающих при репликации коллизий.
Теперь к делу
Нам понадобиться тестовая база данных на сервере которую мы собираемся реплицировать в мобильные устройства. Для репликации на сервере подойдет версия SQL начиная с Microsoft SQL Server 2000. Для репликации подходит только merge модель.
Для настройки базы данных на мобильном терминале можно использовать только Microsoft SQL Server 2008.
Поскольку администраторы SQL вполне обоснованно проявляют здоровый консерватизм в примере мы будем исходить из ситуации, когда центральный сервер работает под управлением Microsoft SQL Server 2005, а для настройки базы данных на мобильном терминале используем Microsoft SQL Server 2008.
Шаг первый. Настройка публикации на центральном сервере.
Если не вдаваться в подробности публикация это настройка именованная, которая описывает, какие таблицы, будут накапливать изменения, которые потом будут отдаваться обратившимся к SQL Server клиентам.
Открывает закладку Local Publication, и создаем новую публикацию как это показано на рисунке:

Выбираем базу данных (в нашем случае база называется Intelmet) и на следующей вкладке выбираем тип репликации merge.

На следующем шаге отмечаем галочкой возможность передавать snapshot в формате мобильного SQL. Для тех, кто немного не в курсе, SQL сервер делает на определенный момент срез данных, от которого потом начинает накапливать изменения. Когда мобильный клиент первый раз обращается к серверу за публикацией ему сначала копируют наиболее свежий срез (snapshot) а уже потом список изменений, приводящий этот срез к текущему состоянию.

Далее выбираем те таблицы, которые будут переноситься, и синхронизироваться с мобильным терминалом:

Далее Вам будет предложено использовать горизонтальные и вертикальные фильтры. Другими словами вы можете реплицировать не всю таблицу, а только ее часть. Например, только некоторые колонки или строки, отфильтрованные по конкретному региону.
Дальше нам будет предложено выбрать параметры безопасности:

Сначала выбираем SQL Server Agent account. Здесь имеется в виду следующее, за запуск различных сервисных функций в SQL сервере отвечает отдельный Windows NT сервис – SQL Server Agent. Каждый сервис NT запускается под определенным именем пользователя. По умолчанию используется локальная учетная запись. Под этой учетной записью сервис обращается к SQL серверу и запускает процедуру формирования snapshot. Если SQL сервер находится на той же машине где работает агент ничего страшного не произойдет. Если на другой, то придется создавать отдельный доменный аккаунт имеющий права для доступа к удаленному компьютеру.
Далее выбираем, как клиент будет соединяться с SQL сервером.
Отвлечемся на общую картину аутентификации. Что происходит, когда вы нажимаете на терминале кнопку синхронизация:
- Терминал выбирает учетную запись из списка credentials. Конкретно для репликации можно назначить свой собственный тип учетной записи, но все пользуются общим.
- Терминал обращается к Web сервису, который отвечает за обработку запросов репликации. Веб сервис сверяет учетную запись с Active Directory и в том случае если соответствие найдено обращается уже от себя к SQL серверу. Если в веб сервисе указано что не аутентифицированные запросы можно обрабатывать под определенной учетной записью то именно под ней будет осуществляться запрос к серверу.
В нашем случае мы будем обрабатывать запросы под учетной записью веб сервиса.
Когда все шаги пройдены, даем публикации наименование (например pubTest) и наблюдает за созданием первого snapshot.

Последний шаг, запуск job отвечающего за периодическое обновление snapshot. Может быть, в новых версиях SQL ошибка уже исправлена, но как говориться привычка вторая натура. Открываем список job и ищем похожее название. В моем случае job называется pubIntelmet-12. Запускаем его и если все шаги отработали без ошибок двигаемся дальше.

Итак, первая стадия пройдена успешно. Теперь приступаем к созданию web сервиса отвечающего за предоставление доступа к нашей публикации.
Мобильный терминал взаимодействует с сервером через набор веб сервисов. Наша задача настроить веб сервис, отвечающий за доступ к настроенной нами публикации.
Для этого воспользуемся визардом ConnWiz.exe который входит в состав инструментария SQL Server Compact Edition.

Этот же визард можно запустить, нажав правую кнопку мыши на публикации из Enterprise Manager SQL Server 2005.
На первом шаге визарда определяем тип подписчиков, которые могут пользоваться web сервисом репликации. Далее выбираем web сервер, на котором мы предполагаем, разместить сервис репликации.

Последний шаг визарда весьма полезен. Там где обычно суммируется результат работы визарда приводится код активации репликации из мобильного приложения на языке C#. Конечно в среде rolepad это обеспечивается отдельным сервисом, но приятно ощущать, что это можно сделать и своими руками, согласитесь.
Результат работы визарда можно посмотреть в настройках IIS.

Для того чтобы убедится в доступности сервиса можно указать пусь на сервис из Internet Explorer.

Если Вы видите такое содержимое, значит опять повезло.
Следующий шаг можно пропустить но лучше подстраховаться .
На этом шаге мы подготовим базу данных для копирования на мобильный терминал и заодно проверим работу репликации.
Из Enterprise manager SQL Server 2008 открываем базу данных AppDatabase.sdf предварительно конечно подключившись к мобильному терминалу и скачав ее на рабочий компьютер.
Для того чтобы открыть базу нужно в диалоге connection выбрать Compact edition.

В базе данных открывает ветку subscription и создаем новую подписку.

После создания подписки запускаем синхронизацию. В результате в локальной базе данных будут созданы таблицы включенные в публикацию.
Не нужно забывать что merge репликация крайне невыгодна с точки зрения разрастания целевой базы. Обязательно проверьте результирующий размер базы после репликации. Если размер значительно увеличился запустите сжатие базы.

Итак приступаем к последней фазе - настройка мобильного терминала.
Сначала в конфигурационном файле мы должны описать ссылку на сервис синхронизации. Для этого необходимо вставить следующие теги в файл app.config.
Этот тег, описывает точку входа для репликационного сервиса.
<add type="Microsoft.Dynamics.Mobile.Framework.EndpointCatalog.IEndpointCatalog, Microsoft.Dynamics.Mobile.Framework.EndpointCatalog" factory="Microsoft.Dynamics.Mobile.Framework.Services.Factories.EndpointCatalogFactory, Microsoft.Dynamics.Mobile.Framework.Runtime">
<configuration xmlns="http://schemas.microsoft.com/Dynamics/Mobile/2008/11/Services/EndpointCatalog/Configuration">
<endpoints>
<add name="Replication" address="http://192.168.1.1/MobileReplication/sqlcesa35.dll" accountName="default"/>
</endpoints>
</configuration>
</add>
<add type="Microsoft.Dynamics.Mobile.Framework.Services.IAgentSetCatalog, Microsoft.Dynamics.Mobile.Framework.Runtime" factory="Microsoft.Dynamics.Mobile.Framework.Services.Factories.AgentSetCatalogFactory, Microsoft.Dynamics.Mobile.Framework.Runtime">
<configuration xmlns="http://schemas.microsoft.com/Dynamics/Mobile/2008/11/Services/AgentSetCatalog/Configuration">
<!-- This section configures the AgentSets that can be executed by the SynchronizationService. -->
<agentSets>
<add name="IntelmetAgent">
<agents>
Следующий тег, добавляет в список агентов синхронизации, агент репликации.
<add name="Mobile Sales" text="Обновление справочников" context="Synchronization step;24" optional="true" type="Microsoft.Dynamics.Mobile.Framework.Services.Synchronization.ReplicationAgent, Microsoft.Dynamics.Mobile.Framework.Runtime">
<configuration>
<labels>
<add key="Label_Initializing" text="Установка соединения" context="Tasklet label;30"/>
<add key="Label_StatusCreatingSubscription" text="Создание подписки {0}." context="Tasklet label;30"/>
<add key=" Label_NoConnectionAvailable " text="Соединение не установлено." context="message box text;315"/>
<add key="Label_StartingReplication" text="Репликация стартовала" context="Tasklet label;30"/>
<add key="Label_InternalError" text="Внешняя ошибка в модуле SqlCe репликации: {0}" context="message box text;315"/>
<add key="Label_DownloadingTable" text="Скачивается таблица {0}." context="Tasklet label;30"/>
<add key="Label_InvalidCredentials" text="Права доступа недостаточны." context="message box text;315"/>
<add key="Label_CredentialsCanNotBeEmpty" text="Не указаны имя пользователя и пароль." context="message box text;315"/>
<add key="Confirm_DropSubscription" text=" Требуется полная синхронизация поскольку на сервере изменились настройки?" context="message box text;315"/>
<add key="Error_SubscriptionHasChanged" text=" The database server configuration has changed. You must synchronize the application fully." context="message box text;315"/>
</labels>
<subscription subscriber="Mobile Sales" publisher="SERVERNAME" publication="pubIntelmet" publisherDatabase="Intelmet" database="AppDatabase" systemDatabase="SysDatabase" endpointName="Replication"/>
</configuration>
</add>
Теперь последний шаг. Настраиваем конфигурационный файл UserRole.xml таким образом чтобы запусть тасклет синхонизации. Разумеется в Вашем случае конфигурация может выглядеть иначе. Предположим мы будем вызывать тасклет синхронизации из основного меню. Для этого в основном меню добавим конструкцию open ссылающуюся на тасклет синхронизации.
<open tasklet="Synchronization" priority="48" text="Синхронизация"></open>
<tasklet name="Synchronization" text="Синхронизация" type="Microsoft.Dynamics.Mobile.Components.Tasklets.SynchronizationTasklet, Microsoft.Dynamics.Mobile.Framework.Runtime">
<configuration>
<labels>
<add key="MenuItem_Start" text="Начать" context="" />
<add key="MenuItem_Stop" text="Остановить" context="" />
<add key="Label_DialogTitleSynchronization" text="Документы" context="" />
<add key="Label_DialogTitleSynchronizing" text="Состояние выполнения" context="" />
<add key="Label_LastExecutedFailed" text="Ошибка {0:dd-MM-yyyy HH:mm:ss}" context="" />
<add key="Label_LastExecutedStopped" text="Остановлен: {0:dd-MM-yyyy HH:mm:ss}" context="" />
<add key="Label_LastExecutedNever" text="Никогда не запускалось" context="" />
<add key="Label_LastExecutedSucceed" text="Удачно: {0:dd-MM-yyyy HH:mm:ss}" context="" />
<add key="Label_StatusWaiting" text="Ожидание" context="" />
<add key="Label_AgentFailedInfo" text="Последний старт провален, ошибок: {0}" context="" />
</labels>
</configuration>
<actions>
<exitTasklet priority="1" text="Выйти" result="Cancel"/>
</actions>
</tasklet>
Запускаем наше мобильное приложение и вызываем тасклет синхронизации. Вы должны увидеть что то похожее на этот диалог.
Нажимаем кнопку старт и следим за результатом. В том случае если операция завершилась неудачей можно нажать на надпись ошибка.
Пара советов тем у кого не получилось. С чего начинать диагностику?
1. Необходимо убедиться в доступности сервиса из мобильного терминала. Наберите адрес сервиса репликации из встроенного Internet Explorer. Если сервис недоступен проверьте настройку прокси на вкладке управления соединениями. Не забывайте что мобильный терминал вставленный в кредл наследует настройки прокси компьютера.
Несколько слов о настройках репликации в SteelTrace Mobile.
SteelTrace Mobile ориентирван в первую очередь на металлургические предприятия. Справочник типоразмеров на некоторых заводах может достигать полумиллиона позиций. Для эффективной работы со справочником на маленьком дисплее мобильного терминала применяется метод кумулятивной рекурсии позволяющий оператору несколькими нажатиями числовых клавиш выбрать нужную позицию. Однако этот метод требует от встроеного SQL работы с большими объемами данных.
Вот несколько советов которые необходимо соблюдать в обязательном порядке:
1. Помните что при включении таблицы в репликацию merge автоматически создается поле типа GUID обеспечивающее уникальность записи в не зависимости от места ее возникновения. Исключите из импортируемоего справочника поля с аналогичной смысловой нагрузкой.
2. Индексы необходимо конструировать с особым вниманием. Помните SQL Compact не обладает механизмом оптимизации запросов привычным в большом SQL следовательно нужно избегать кумулятивных запросов и стараться избегать избыточных индексов. Готовая модель данных для типового справочника демонстрирует хороший баланс производительности и размера. Не изменяйте ее без крайней необходимости.