Переход, срабатывающий при получении сообщения


Такой переход сработает, когда диаграмма состояний получит сообщение (значение примитивного типа Java или объект заданного Java класса, удовлетворяющий заданному дескриптору сообщения). 

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

Когда сообщение будет получено в диаграмме состояний:

Вы можете выполнять проверку содержимого сообщения и принимать только те сообщения, которые удовлетворяют заданным критериям проверки:

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

  1. Выделите переход в графическом редакторе.
  2. В панели Свойства выберите При получении сообщения из выпадающего списка Происходит.
  3. Если вы хотите выполнять фильтрацию сообщений по типу, то с помощью выпадающего списка Тип сообщения нужно будет выбрать, сообщения какого типа будут приниматься (если вы хотите задать какой-то из неперечисленных здесь Java классов, выберите опцию Другой и введите имя класса в поле справа. В этом случае переход сможет сработать только при получении сообщений заданного здесь Java класса. 
  4. Если же вы не хотите выполнять такую фильтрацию сообщений, оставьте выбранной опцию Другой и введите Object в этом поле.
  5. Теперь можете задать дополнительные условия проверки содержимого сообщения с помощью группы кнопок Осуществлять переход.
  6. Если вы не хотите задавать никаких условий - просто выберите Безусловно.
  7. Если вы хотите задать принимать сообщения только с заданным содержимым, выберите опцию При получении заданного сообщения и задайте дескриптор сообщения в поле Сообщение ниже. Такая проверка будет работать следующим образом: при получении сообщения, AnyLogic вызовет метод equals() дескриптора, передав методу сообщение в качестве параметра. Если метод equals() вернет true, то такое сообщение будет принято. Если false - то это будет означать, что соответствия не найдено, и сообщение будет проигнорировано. Примеры дескрипторов: "STOP!" для сообщения типа String5.0 для сообщения типа Double.
  8. Если же вы хотите задать сложный механизм проверки содержимого сообщения с помощью логического условия, выберите опцию Если выполняется условие. Введите условие в расположенном ниже поле Выражение. Только что полученное сообщение доступно здесь как переменная msg.
  9. Введите код, который будет выполняться при срабатывании перехода, в поле Действие.
  10. Введите дополнительное условие, которое должно быть выполнено для того, чтобы было разрешено срабатывание этого перехода, в поле Доп. условие

Очередь диаграммы состояний

Иногда вам может понадобиться добавлять поступающие в диаграмму состояний сообщения в очередь. Очередь нужна для того, чтобы диаграмма состояний могла принимать сообщения, в те моменты, когда она не может их обработать (например, когда выполняется переход диаграммы состояний).

Добавить сообщение в очередь диаграммы состояний можно путем вызова метода диаграммы состояний fireEvent()

Очередь событий обрабатывается диаграммой состояний при происхождении любой активности в этой диаграмме или при вызове метода fireEvent(). При этом происходит последовательная проверка всех сообщений в очереди, начиная с самого "старого" в соответствии со следующим алгоритмом:

Диаграмма состояний может последовательно обработать сразу несколько сообщений из очереди (это занимает нулевое модельное время). 

См. также

 Диаграммы состояний

 Переход

 Срабатывание перехода