Сообщения

Сообщение представляет собой пакет данных, передаваемый между агентами. Сообщения могут моделировать различные объекты реального мира. С помощью сообщений можно реализовать механизм оповещения – в этом случае сообщения будут представлять команды или сигналы, посылаемые системой управления. Или же можно смоделировать поток агентов, в этом случае сообщения будут представлять собой агентов: это могут быть документы в модели бизнес-процесса, клиенты в системе массового обслуживания, детали в производственной моделях, пакеты данных в модели компьютерной сети и т.п.

Сообщениями могут быть экземпляры любых классов Java. Обычно сообщение используется для передачи какой-то информации. Чтобы создать такое сообщение, нужно создать Java класс с требуемыми полями и, возможно, методами.

Если с помощью сообщений вы хотите просто уведомлять объект о происхождении каких-то событий, то вы можете просто использовать сообщения типа Object.

Посылка сообщений

Как послать сообщение?

Чтобы послать сообщение, нужно вызвать метод порта send(), передав экземпляр Java класса, моделирующего сообщение, в качестве параметра. Создание ваших собственных Java классов в AnyLogic описано здесь.

Если вам не нужно передавать в сообщении какую-то информацию, а нужно просто послать объекту сигнал о происхождении какого-то события, то вы можете вызвать метод send() без параметров, в этом случае будет послано пустое сообщение типа Object.

Например, для того, чтобы при запуске модели из порта portA посылалось сообщение типа Message, нужно ввести следующую строку в поле действия При запуске агента (секция Действия агента свойств типа агента):

portA.send( new Message() );

Задание действий, выполняемых при отправке сообщения

В поле Действие при отправке в секции свойств порта Действия обработки сообщений вы можете задать действия, которые должны выполняться при отправке сообщения из порта. Вы можете работать с содержимым посылаемого сообщения, доступного как локальная переменная msg. Код может содержать выражение return, возвращающее true или false. Если возвращается true, то сообщение будет обрабатываться согласно правилам пересылки сообщения. То же произойдет, если оставить поле Действие при отправке пустым. Если вы напишете return false; или если вы напишете какой-нибудь код, но не напишете выражение return, то сообщение обрабатываться согласно заданным правилам не будет.

Получение сообщений

При получении сообщения вы можете отреагировать на это событие одним из описанных ниже способов.

Выполнение заданного Действия при получении

В поле Действие при получении в секции свойств порта Действия обработки сообщений вы можете задать действия, которые должны выполняться при получении сообщения портом. Вы можете работать с содержимым только что полученного сообщения, доступного как локальная переменная msg. Код может содержать выражение return, возвращающее true или false. Если возвращается true, то сообщение будет пересылаться дальше согласно правилам пересылки сообщения. То же произойдет, если оставить поле Действие при получении пустым. Если вы напишете return false; или если вы напишете какой-нибудь код, но не напишете выражение return, то сообщение пересылаться дальше не будет.

Правила передачи сообщений

Когда вы посылаете сообщение из порта, оно пересылается наружу по всем внешним соединениям этого порта с портами других объектов.

Когда сообщение приходит в порт, оно пересылается во все соединенные диаграммы состояний и по всем внутренним соединениям агента, которому принадлежит этот порт.

Поступившее в порт сообщение будет обрабатываться по-разному в зависимости от того, откуда это сообщение поступило:

При поступлении сообщения в диаграмму состояний, вызывается метод receiveMessage() этой диаграммы состояний.

Правила пересылки сообщений проиллюстрированы на рисунке.


Фильтрация сообщений по типу

Иногда может потребоваться сортировать входящие и/или отправляемые сообщения по их типу – т.е., принимать и отправлять сообщения только одного определенного типа, игнорируя сообщения всех остальных типов.

Фильтрация сообщения по типу реализуется очень легко - простым указанием имен типов сообщений, которым разрешено быть посланными и/или принятыми этим портом. Сообщения, которые не смогут быть приведены к указанному типу, будут проигнорированы и удалены.

Чтобы фильтровать входящие в порт/исходящие из порта сообщения по типу

  1. Выделите порт на диаграмме.
  2. Перейдите в секцию Специфические панели свойств порта.
  3. Укажите типы сообщений, которым разрешено быть принятыми и посланными этим портом в полях Тип входящего сообщения и Тип исходящего сообщения соответственно. Все созданные вами в рамках модели Java классы будут доступны в выпадающем списке.
    Если вы оставите в поле Object, то фильтрация сообщений по типу производиться не будет.

Фильтрация сообщений по содержимому

Часто бывает нужно реализовать проверку содержимого поступающих в порт сообщений и организовать фильтрацию сообщений по их содержимому – т.е., принимать только те сообщения, которые удовлетворяют заданным условиям, и отбрасывать остальные.

В AnyLogic вы можете легко реализовать любую проверку содержимого сообщений с помощью поля порта Действие при получении. Здесь вы можете ввести код проверки содержимого сообщения и игнорировать прибывающие сообщения или же принимать их в зависимости от результат проверки, написав соответственно return false; или return true;.

Чтобы фильтровать входящие в порт сообщения по содержимому

  1. Пусть, например, у мы моделируем клиент-серверную систему, в которой сервер обрабатывает запросы от клиентов, содержащие имя и адрес клиента. (Запрос задан в модели с помощью Java класса Request с полямиname и address типа String). Мы хотим игнорировать сообщения с незаполненными полями.
  2. Выделите на диаграмме порт, чьи входящие сообщения мы хотим фильтровать.
  3. В секции Специфические выберите тип Request в поле порта Тип входящего сообщения.
  4. Задайте операции проверки содержимого сообщения в поле порта Действие при получении в секции свойств Действия обработки сообщений. В нашем случае ваш код должен выглядеть так:

    if ( msg.name == null || msg.address == null ),
    return false;
    else {
    // обрабатываем полученный запрос
    return true;
    }

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


См. также

Передача сообщений

Порты