Регистрация соединенных объектов

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

Регистрация агентов может быть реализована различными способами. Следующий способ является простейшим: при запуске модели каждый агент посылает регистрационное сообщение, идентифицирующее этот агент (содержащее ссылку на самого себя), по всем соединениям порта этого агента. Порт, получивший это сообщение, должен будет извлечь информацию о пославшем это сообщение агенте и сохранить ее в списке соединенных объектов.

 Чтобы реализовать регистрацию соединенных объектов

  1. Давайте проиллюстрируем этот подход на простейшем примере. Скажем, в вашей модели есть набор вложенных агентов типа MyClass, чьи порты как-то графически соединены (см. рисунок ниже), и вы хотите, чтобы у каждого объекта был список соединенных с ним объектов.

  
  1. Создайте Java класс RegMsg, экземпляры которого будут представлять в модели регистрационные сообщения. Создайте у класса поле object типа Agent для хранения в сообщении ссылки на агента. (Создание Java классов описано здесь). 
  2. Создайте коллекцию в типе агента MyClass для хранения информации о соединенных с данным агентом объектах. Назовите ее, например, connectedObjects. Задайте Agent в качестве Типа элементов коллекции.
  3. Создайте ваш собственный класс порта MyPort и сделайте порт вашего агента экземпляром этого класса, как описано здесь
  4. В открывшемся Java редакторе введите код созданного класса порта, как показано на рисунке ниже:

Давайте изучим только что введенный код. Вначале идет конструктор класса, который по сути вызывает стандартный конструктор базового класса Port.

Метод receive()вызывается при получении сообщения. Здесь происходит проверка типа прибывшего сообщения. Если это регистрационное сообщение, то его отправитель будет добавлен в список соединенных объектов (наша коллекция connectedObjects). Если нет - то сообщение продолжит обрабатываться в соответствии с логикой модели. 

Метод register() производит посылку регистрационного сообщения, содержащего ссылку на активный объект, возвращаемую методом порта getAgent().

  1. Введите следующую строку в поле Действие при запуске класса MyClass, чтобы при создании объекта вызывался метод его порта register():
    port.register();

Теперь мы закончили реализацию механизма регистрации соединенных объектов. Работать с содержимым списка объектов connectedObjects  можно так же, как и с любой другой коллекцией, используя программный интерфейс коллекции.

Объект может иметь несколько портов. В этом случае вам нужно будет составить список соединенных с портом портов, а не объектов, чтобы иметь возможность различать сообщения, приходящие от разных портов одного объекта. Чтобы реализовать регистрацию портов, нужно сделать незначительные изменения в описанном выше механизме: ваш класс порта должен иметь поле port типа MyPort, и метод register() должен посылать ссылку не на активный объект, а на сам порт-отправитель, которую можно получить с помощью оператора this.