В данной статье будет описан класс посредника необходимый для асинхронного связывания между собой всех подсистем игрового движка. Он написан с использование библиотеки java.util.concurent(ConcurrentMap<V>, ArrayBlockingQueue<V>, FixedThreadPool, SingleThreadExecutor). Его реализация включается в себя классы Manager, Subscriber, Message. Класс Manager реализует посредника в нем осуществляется вся работа по отправке и маршрутизации сообщений между Подписчиками, Subscriber реализует методы необходимые для роботы подписчика(подписка на сообщения и реакция на полученные сообщения), Message это собственно сообщения которыми обмениваются Подписчики ничего не зная о друг друге.
Общая архитектура взаимодействия представлена на рисунке ниже. Логика работы заключается в следующем: 1) Подписчик подписывается у посредника(Subscriber) на сообщения(Message) в качестве ключа используется ID сообщения, или группы сообщений. 2) Посредник при получении сообщения, помещает его в буфер FIFO. 3) Обработчик сообщений забирает сообщения из буфера и запускает задачу в рамках которой он просматривает дерево подписчиков и вызывает для каждого подписчика метод notify(Message msg), каждая задача запускается в отдельном потоке.
При инициализации Посредника ему указывается размер буфера, время ожидания следующей попытки добавления сообщения в буфер в том случае если он переполнен, а также размер пула потоков для обработчика сообщений. Параметры указываемые при инициализации Посредника очень важны т.к. если размер буфера будет слишком мал или обработчики будут не успевать обрабатывать сообщения то произойдет падение производительности. Их необходимо подбирать исходя из того насколько длительным по времени исполнения будет метод notify.
|