AnyLogic
Развернуть
Размер шрифта

Реализация потока агентов в пользовательских библиотеках

В этой статье мы осветим несколько моментов, которые могут быть вам полезны, если вы разрабатываете свою библиотеку из блоков и внедряете в нее поддержку потока агентов (заявок) через интерфейсные порты блоков вашшей библиотеки.

Посылка агентов-заявок

Как послать агента через порт блока вашей библиотеки?

Чтобы послать агента через порт, нужно вызвать метод порта send(), передав ссылку на агента в качестве параметра. Вы можете вызвать метод send() без параметров, в этом случае будет послан объект типа Object.

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

portA.send( new Message() );

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

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

Получение агентов-заявок

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

Правила передачи агентов-заявок

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

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

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

  • Если агент поступил в порт из порта вложенного агента или блока, то он посылается дальше по всем внешним соединениям этого порта с портами других агентов. В этом случае вызывается метод порта send() и выполняется Действие при отправке, заданное для этого порта.
  • Если же агент-заявка поступил в порт «снаружи» из порта агента, находящегося выше или на том же уровне иерархии, что и агент-владелец этого порта, то это заявка считается принятой и передается дальше по всем внутренним соединениям агента, которому принадлежит этот порт. В этом случае вызывается метод порта receive() и выполняется Действие при получении, заданное для этого порта.

Правила пересылки заявок проиллюстрированы на рисунке.

Фильтрация агентов-заявок по типу

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

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

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

  1. Выделите порт на диаграмме.
  2. Перейдите в секцию Специфические панели свойств порта.
  3. Укажите типы агентов, которым разрешено быть принятыми и посланными этим портом в полях Тип входящего сообщения и Тип исходящего сообщения соответственно.
    Если вы оставите в поле 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 мы запрещаем обработку прибывшего агента, принятую по умолчанию. И поэтому агенты, полученные этим портом, не будут перенаправляться дальше согласно правилам пересылки.
Как мы можем улучшить эту статью?