В этой статье мы осветим несколько моментов, которые могут быть вам полезны, если вы разрабатываете свою библиотеку из блоков и внедряете в нее поддержку потока агентов (заявок) через интерфейсные порты блоков вашей библиотеки.
Чтобы послать агента через порт, нужно вызвать метод порта 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() и выполняется Действие при получении, заданное для этого порта.
Правила пересылки заявок проиллюстрированы на рисунке.
Иногда может потребоваться сортировать входящие и/или отправляемые заявки по их типу — т.е., принимать и отправлять заявки только одного определенного типа, игнорируя заявки всех остальных типов.
Фильтрация агентов-заявок по типу реализуется очень легко — простым указанием имен типов агентов, которым разрешено быть посланными и/или принятыми этим портом. Агенты, которые не смогут быть приведены к указанному типу, будут проигнорированы и удалены.
Чтобы фильтровать входящих в порт/исходящих из порта агентов по типу
- Выделите порт на диаграмме.
- Перейдите в секцию Специфические панели свойств порта.
- Укажите типы агентов, которым разрешено быть принятыми и посланными этим портом в полях Тип входящего сообщения и Тип исходящего сообщения соответственно.
Если вы оставите в поле Object, то фильтрация сообщений по типу производиться не будет.
Часто бывает нужно реализовать проверку содержимого поступающих в порт агентов и организовать их фильтрацию по содержимому — т.е., принимать только тех агентов, которые удовлетворяют заданным условиям, и отбрасывать остальных.
В AnyLogic вы можете легко реализовать любую проверку содержимого агентов с помощью поля порта Действие при получении. Здесь вы можете ввести код проверки содержимого агента и игнорировать прибывающих агентов или же принимать их в зависимости от результат проверки, написав соответственно return false; или return true;.
Чтобы фильтровать поступающих в порт агентов по содержимому
- Пусть, например, мы моделируем клиент-серверную систему, в которой сервер обрабатывает запросы от клиентов, содержащие имя и адрес клиента. (Запрос задан в модели с помощью Java класса Request с полями name и address типа String). Мы хотим игнорировать агентов с незаполненными полями.
- Выделите на диаграмме порт, чьих входящие агентов мы хотим фильтровать.
- В секции Специфические выберите тип Request в поле порта Тип входящего сообщения.
- Задайте операции проверки содержимого агента в поле порта Действие при получении в секции свойств Действия обработки сообщений. В нашем случае ваш код должен выглядеть так:
if ( msg.name == null || msg.address == null ), return false; else { // обрабатываем полученный запрос return true; }
-
Как мы можем улучшить эту статью?
-