Работу сервера декларирует интерфейс 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 атрибутом CreateNewValueInXafariValueManagerAttribute;
- Чтобы получать новый экземпляр Z, зарегистрируйте делегат, который возвращает новое значение через статические методы класса XafariMultiThreadValueManagerHelper.
Теперь, если вы обратитесь к экземпляру класса Z, то получите его новое значение в текущем потоке.