SObjectizer  5.1

Оглавление

gemont_2: Версия 2.0.0.

Введение

Для 4-го поколения SObjectizer была написана дополнительная библиотека распространения сообщений мониторинговой информации, которая получила название GEMONT. Идея GEMONT заключалась в выполнении таких задач, как фиксация мониторинговой информации, передача её заинтересованным сторонам в виде SObjectizer сообщений. При переходе на SObjectizer 5-го поколения функциональность библиотеки была перенесена с учётом, как всех реализованных возможностей, так и с добавлением некоторых новых требований. Таким образом, библиотека gemont_2 представляет из себя расширенную версию gemont_1 и, в терминах SObjectizer 5, представляет собой слой gemont_layer для работы с библиотекой, реализацию базовых типов источников данных и базовый агент-ретранслятор сообщений мониторинговой информации.

Основные понятия

Источники данных

Ключевым элементом gemont_2, так же как и gemont_1, по прежнему является понятие источника данных. Источник данных — это именованная сущность, которая содержит текущее значение. Изменение источника данных приводит к распространению нового значения. В программе источники данных представляются в виде объектов класса шаблонного scalar_data_source_t. Например:

class a_agent_t
:
{
private:
// Строковый источник
std::unique_ptr< gemont_2::scalar_data_source_t< std::string > >
str_data_source;
public:
void
so_evt_start()
{
// Инициализация и старт источника данных
str_data_source.reset(
// Слой gemont_2.
*( so_environment().query_layer< gemont_2::
gemont_layer_t >() ),
// Имя источника данных.
"string_data_source_name",
// Имя класса данных.
"data_class",
// Начальное значение.
"initval value" ) );
}
// ...
}

Из данного примера видно, что источник данных содержит в себе информацию о своём имени, имени класса данных и текущем значении. Так же источнику передаётся ссылка на слой gemont, с которым соотносится далее в результате регистрции. Сообщения мониторинговой информации об изменении значение отправляются на специальный mbox указанного слоя.

Нужно отметить, что параметром шаблонна scalar_data_source_t могут быть следующие типы данных:

Распространение мониторинговой информации

Сообщения gemont_2 бывают трёх типов: msg_reg_data_source, msg_dereg_data_source и msg_scalar_value. Их можно получить, подписавшись на предназначенный для этого mbox слоя gemont_2. Для примера см. Ретранслятор. Сообщения первых двух типов отправляются в момент начала работы источника данных и завершения соответственно. Сообщение msg_scalar_value, в свою очередь, отсылается при изменении значения источника данных.

Сообщение msg_reg_data_source является уведомлением о появлении нового источника данных. Сообщение имеет следующие атрибуты:

Сообщение msg_dereg_data_source уведомляет об исчезновении источника данных. В нем передается лишь имя и уникальный идентификатор исчезнувшего источника.

Сообщение msg_scalar_value уведомляет о новом значении источника данных. Сам источник данных указывается при помощи уникального идентификатора, в поле m_value содержится новое значение, а время изменения – в m_timestamp.

Если необходимо получить дополнительную информацию об источнике данных по его идентификатору, можно воспользоваться методом gemont_layer_t::sources(), который возвращает объект sources_list_t, который содержит информацию обо всех именах источников данных. Например:

... // описание SO5-агента с подпиской на gemont_layer_t
void
a_sample_t::evt_scalar_value(
{
gemont_layer_t * gemont_layer =
so_environment().query_layer< gemont_2::gemont_layer_t >();
std::cout << gemont_layer->sources()[ msg->m_id ] << std::endl;
}
...

В результате выполнения данного фрагмента на консоль будет выведено имя источника данных, идентификатор которого был получен в сообщении.

Значение источника данных

Значение источника данных хранится в качестве реализации интерфейса data_source_value_t для одного из поддерживаемых типов. Тип конкретного значения можно получить через атрибут интерфейса data_source_value_t::m_data_source_type. Возможные значения этого атрибута содержатся в перечислении data_source_type::types_t. Такой подход позволяет иметь по одному типу уведомительного сообщения о создании и изменении источника данных: msg_reg_data_source и msg_scalar_value. Само значение конкретного типа можно получить при помощи методов data_source_value_t::query_value(). Если тип запрашиваемого значения не совпадает с типом, который реально хранится в объекте, то будет выброшено исключение.

Слой gemont_layer

Слой gemont_2 представляется классом gemont_layer_t. Его задача контролировать регистрацию и дерегистрацией источников данных, для чего он хранит таблицу зарегистрированных источников данных. Помимо этого слой так же содержит в себе специальный mbox, на который приходят сообщения мониторинговой информации об изменениях значений источников данных. Доступ к этому mbox-у предоставляется при помощи – gemont_layer_t::dafault_mbox(). Агент, подписавшийся на gemont-сообщения от данного mbox-а, будет получать сообщения о регистрации новых и дерегистрации существующих в таблице источников, а также об их изменениях.

Таблица имен источников данных представляется типом sources_list_t, который соотносит каждый уникальный идентификатор source_id_t с именем источника данных. Доступ к этой таблице происходит при помощи метода gemont_layer_t::sources().

Ретранслятор

Третьей важной частью gemont_2 является базовый ретранслятор, который представляется абстрактным классом a_retranslator_base_t и представляет из себя агент, основная цель которого - передача актуального списка источников данных и их значений.

Механизм работы ретранслятора заключается в следующем. Во время старта агент опрашивает слой gemont_2 на предмет таблицы источников данных и составляет свою таблицу, которая дополнительно хранит текущие значения источников. Так же, как и слой gemont_2, ретранслятор поддерживает таблицу в актуальном состоянии. Все данные об изменениях, в свою очередь, передаются в соответствующие методы ( по обновлению значение источника – a_retranslator_base_t::on_update(), по регистрации источника – a_retranslator_base_t::on_reg(), по дерегистрации – a_retranslator_base_t::on_dereg()). Таким образом, наследование от a_retranslator_base_t с переопределением вышеперечисленных методов предоставляет интерфейс к получению информации о текущем состоянии мониторинговых данных.

Стоит отметить, что реализация ретранслятора позволяет ограничить поток сообщений по частоте в случаях, когда такое поведение нежелательно. По умолчанию ретранслятор обращается к a_retranslator_base_t::on_update() не чаще, чем раз в 250мс (значение определяется параметром sending_time_interval конструктора). Сообщение пришедшее раньше указанного промежутка времени будет отложено до окончания периода. В случае с несколькими сообщениями, в конце периода будет отправлено последнее из пришедших значений.


Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:21. Создано системой  doxygen1.8.3.1 Intervale SourceForge.net Logo