Работу сервера декларирует интерфейс IDataObserver:

 

  public interface IDataObserver:IDisposable

   {

 

      /// <summary>

      /// Strategy for create handlers for message processing

      /// </summary>

      ServerHandlersStrategy ServerHandlersStrategy { get; }

 

      /// <summary>

      ///  XafApplication

      /// </summary>

      XafApplication Application { get; }

 

      /// <summary>

      /// Start queue listener

      /// </summary>

      void StartListenQueue();

 

      /// <summary>

      /// Stop queue listener

      /// </summary>

      void StopListenQueue();

 

      /// <summary>

      /// Wait listener

      /// </summary>

      void Wait();

 

   }

 

Сервер выполняет функции мониторинга новых сообщений, а также их диспетчеризацию. Если в базе данных появилось новое Сообщение со статусом WaitingForExecution, то Сервер его блокирует, изменяет статус на Processing и передает соответствующему Обработчику. Чтобы Сервер нашел требуемый Обработчик, зарегистрируйте Обработчик (см. Обработчики Сообщений).

Инициализация сервера происходит в модуле Xafari.Server. Доступ к интерфейсу сервера осуществляется через поле DataObserver типа IDataObserver.

В локальном режиме Сервер работает асинхронно от приложения.

В ряде ситуаций для обработки Сообщения серверу необходимо иметь те же права, которыми обладает пользователь, создавший Сообщение. Эту задачу решает класс MQSecuredObjectSpaceProvider. Используйте его в качестве провайдера для приложения. Метод RegisterUser регистрирует пользователя в новом потоке, после завершения работы пользователя следует разрегистрировать (удалить методом UnRegisterUser). Регистрировать пользователя в основном потоке нельзя. Также нельзя регистрировать несколько пользователей в одном потоке.

Замечание:

Используйте XafariMultiThreadValueManager<T> в качестве типа ValueManager приложения. Так как сервер работает асинхронно, то в новых потоках может понадобиться создать новый экземпляр класса Z из ValueManager. Для этого выполните следующее:

Теперь, если вы обратитесь к экземпляру класса Z, то получите его новое значение в текущем потоке.