Сообщение (Message)

Персистентный объект, представляющий Cообщение, реализован в виде доменного компонента MQMessage:

[DomainComponent]

public interface MQMessage

{

    MessageStatus CurrentStatus { get; set; }

 

    DateTime CreatedDate { get; set; }

 

    string Tag { get; set; }

 

    [FieldSize(410)]

    string Description { get; set; }

 

    string User { get; set; }

 

    [PersistentDc]

    XPWeakReferenceStruct MessageData { get; set; }

}

 

Добавлять новые Cообщения в Очередь необходимо с помощью метода

 

MQManager.Instance.InsertMessage<T>(T messageData, string tag, string description)

 

Каждое Сообщение может содержать дополнительные данные, которые требуются для последующей обработки Сообщения. Эти данные предоставляются в виде произвольного персистентного объекта. Они хранятся в поле MQMessage.MessageData (поле имеет тип Xafari.Base.XPWeakReferenceStruct).

При работе с Сообщениями необходимо использовать специальный Object Space. Получить его можно с помощью вызова:

 

MQManager.Instance.CreateObjectSpace()

 

В этом же Object Space необходимо работать с дополнительными данными Сообщения (см. выше).

Каждому типу Сообщения присваивается уникальный тег. Используя этот тег, сервер рассылает Сообщения соответствующим Обработчикам.

Значение поля CurrentStatus показывает текущее состояние сообщения в очереди. Поле принимает значения перечисления MessageStatus.

Информация об ошибке (Xafari.MQ.MQError)

В процессе обработки Сообщения могут возникать ошибки. Детальная информация об ошибке (исключении) сохраняется в таблице Xafari.MQ.MQError. Если при просмотре очереди сообщений (списковая форма MQMessage_ListView), выбрать сообщение с ошибкой, становится доступным действие «Информация об ошибке» (“Error details”). При выполнении этого действия открывается детальная форма с информацией об ошибке.

Обработчики сообщений

Все Обработчики Сообщений должны реализовать интерфейс Xafari.Server.IMessageHandler. С целью упрощения задачи по реализации новых Обработчиков Сообщений создан базовый абстрактный класс Xafari.Server.MessageHandler. Этот класс реализует логику по блокировке сообщения, выполняет запуск обработчика в отдельном потоке, генерирует события, объявленные в интерфейсе IMessageHandler. При разработке нового обработчика сообщений, в классе-наследнике  Xafari.Server.MessageHandler требуется переопределить абстрактный метод

 

protected abstract void ProcessMessageCore(IObjectSpace messageObjectSpace, MQMessage message, CancellationToken token);

 

Во время работы сервера этот метод вызывается в отдельном потоке (вся логика реализована в классе Xafari.Server.MessageHandler). Перед вызовом метода обрабатываемое сообщение переводится из состояния «WaitingForExecution» в состояние «Processing». Если при обработке сообщения не возникает исключений, то при завершении работы метода ProcessMessageCore, обрабатываемое сообщение переводится в состояние «Finished». В случае, когда исключение возникает, сообщение переводится в статус «Error». В  таблице Xafari.MQ.MQError сохраняется детальная информация об ошибке.

На текущий момент в составе платформы Xafari реализован обработчик сообщений Xafari.Reports.Server.ReportMessageHandler (находится в сборке Xafari.Reports.Server.dll). Этот обработчик выполняет функции Сервера Отчетов.