Переход, срабатывающий при
получении сообщения
Такой переход сработает, когда диаграмма состояний получит сообщение (значение примитивного типа Java или объект заданного Java класса, удовлетворяющий заданному дескриптору сообщения).
Есть три способа передачи сообщений в диаграмму состояний:
- Первый: Вам нужно соединить порт с диаграммой состояний. Тогда сообщения, приходящие в порт, будут автоматически направляться в диаграмму состояний.
- Второй: Вы можете сгенерировать сообщение, вызвав метод диаграммы состояний receiveMessage().
- Третий: Вы можете сгенерировать сообщение, вызвав метод диаграммы состояний fireEvent(). Но в этом случае сообщение попадет в очередь сообщений диаграммы состояний. Обработка событий очереди описана здесь.
Когда сообщение будет получено в диаграмме состояний:
- Если из текущего простого состояния или из сложных состояний, в
которые входит это простое состояние, будет исходить один или несколько
переходов, условия срабатывания которых соответствуют этому сообщению,
то такие переходы будут считаться разрешенными, т.e. один из этих
переходов (если выполнится его дополнительное условие) мгновенно
сработает и сообщение будет удалено.
- Если таких переходов не будет, то сообщение будет проигнорировано и удалено.
Вы можете выполнять проверку содержимого сообщения и принимать только
те сообщения, которые удовлетворяют заданным критериям проверки:
- Это может быть проверка типа сообщения, то есть будут приниматься только сообщения заданного типа.
- Или же это может быть проверка содержимого сообщения - Вы
можете указать, чему должно быть равно входящее сообщение, или же
задать условие, которое будет анализировать содержимое сообщение и
выдавать в качестве результата вердикт - будет ли это сообщение
принято диаграммой состояний или нет.
Чтобы сделать переход срабатывающим при получении сообщения
- Выделите переход в графическом редакторе.
- На странице Основные панели Свойства выберите При получении сообщения
из выпадающего списка Происходит.
- Если Вы хотите выполнять фильтрацию сообщений по типу, то с помощью группы кнопок Тип сообщения нужно будет выбрать, сообщения какого типа будут приниматься (если Вы хотите задать какой-то из неперечисленных здесь Java классов, выберите опцию Другой и введите имя класса в поле Имя класса. В этом случае переход сможет сработать только при получении сообщений заданного здесь Java класса.
- Если же Вы не хотите выполнять такую фильтрацию сообщений, оставьте выбранной опцию Другой и введите Object в поле Имя класса
- Теперь можете задать дополнительные условия проверки содержимого сообщения с помощью группы кнопок Осуществлять переход.
- Если Вы не хотите задавать никаких условий - просто выберите Безусловно.
- Если Вы хотите задать принимать сообщения только с заданным содержимым, выберите опцию Если сообщение равно и задайте дескриптор сообщения в поле справа. Такая проверка будет работать следующим образом: при получении сообщения,
AnyLogic вызовет метод equals() дескриптора, передав методу сообщение в качестве параметра. Если метод equals() вернет true, то такое сообщение будет принято. Если false - то это будет означать, что соответствия не найдено, и сообщение будет проигнорировано.
Примеры дескрипторов: "STOP!" для сообщения типа
String; 5.0 для сообщения типа Double.
- Если же Вы хотите задать сложный механизм просерки содержимого сообщения с помощью логического условия, выберите опцию Если выполняется условие (сообщение доступно как msg). Введите условие в расположенном ниже поле. Только что полученное сообщение доступно здесь как переменная msg.
- Введите дополнительное условие, которое должно быть выполнено
для того, чтобы было разрешено срабатывание этого перехода, в поле
Доп. условие.
- Введите код, который будет выполняться при срабатывании перехода, в поле Действие.
Очередь диаграммы состояний
Иногда Вам может понадобиться добавлять поступающие в диаграмму
состояний сообщения в очередь. Очередь нужна для того,
чтобы диаграмма состояний могла принимать сообщения, в те моменты,
когда она не может их обработать (например, когда выполняется переход
диаграммы состояний).
Добавить сообщение в очередь диаграммы состояний можно путем вызова метода диаграммы состояний fireEvent().
Очередь событий обрабатывается диаграммой состояний при происхождении любой активности в этой диаграмме или при вызове метода fireEvent(). При этом происходит последовательная проверка всех сообщений в очереди, начиная с самого "старого" в соответствии со следующим алгоритмом:
- Если из текущего простого состояния или из сложных состояний, в
которые входит это простое состояние, исходит один или несколько
переходов, условия срабатывания которых соответствуют проверяемому
сообщению, то такие переходы считаются разрешенными, т.e. один из этих
переходов (если выполнится его дополнительное условие) сработает. В
этом случае это событие, а также все события, предшествующие
ему в очереди диаграммы состояний, будут удалены из очереди.После этого будет обрабатываться следующее сообщение очереди.
- Если таких переходов не будет, то будет обрабатываться следующее сообщение очереди.
Диаграмма состояний может последовательно обработать сразу
несколько сообщений из очереди (это занимает нулевое модельное
время).
См. также
Диаграммы состояний
Переход
Срабатывание перехода