Moduł message
Pakiet message
Zajmuje się reprezentacją wiadomości przesyłanej między węzłami oraz jej konstrukcją.
Message
Reprezentuje wiadomość przesyłaną w sieci.
Konstruktor przyjmuje identyfikatory nadawcy i adresata oraz obiekt Body
odpowiedni dla typu wiadomości.
Metoda clone(int receiver)
klonuje dany obliekt ze zmienionym adresatem. Używana podczas wysyłania wiadomości broadcastowych. Jest implementacją wzorca projektowego “Prototyp”.
serialize()
implementuje wzorzec projektowy “template method”. Zwraca ciąg reprezentujący wiadomość w formacie json takim, jak tutaj. Używa do tego celu metod Body.serializeType()
i Body.serializeContent()
.
Metoda process(MessageProcessContext context)
wywołuje process(int sender, MessageProcessContext context)
na obiekcie Body
w ramach wzorca “strategy”.
MessageParser
Zamienia string z wiadomością w formacie json
na obiekt Message
.
Pakiet body
Zajmuje się działaniem ciała wiadomości.
Body
Jest interfejsem dla każdej wiadomości.
serializeType()
i serializeContent()
zwracają odpowiednio ciąg reprezentujący typ wiadomości oraz jej ciało w formacie json
. Używane do komponowania znakowej reprezentacji obiektu.
Metoda process(int sender, MessageProcessContext context)
realizuje wzorzec projetkowy “strategy”. Przetwarza wiadomość i aplikuje jej efekty na zgrupowanych obiektach w zmiennej context
.
Implementacje Body
Odpowiadają wszystkim typom wiadomości. Implementują ich efekty i budowę.
Pakiet process
Odpowiada za przetwarzanie wiadomości i zmian stanu. Implementuje protokoły sieci peer to peer.
MessageProcessor
Przetwarza wiadomości w ramach osobnego wątku. Odpowiada za cykliczne wołanie metod NodeRegister
, HeartBeatEmiter
i StateObserver
. Wątek zasypia maksymalnie na czas HeartBeatEmiter.nextBeatTime()
za pomocą metody Idle.sleep(float)
gdy nie ma nic do roboty . Jest budzony metodą IdleInterrupter.interrupt()
przez wątek, który dodał jakąś pracę.
StateObserver
Obserwuje zmiany stanu i tworzy wiadomości, gdy zmiana wymaga poinformowania innych węzłów.
NodeRegister
Kontroluje heart beat pozostałych węzłów oraz składuje informacje o pozostałych węzłach w sieci.
FutureProcessor
Gdy do przetworzenie wiadomości jest wymagana wartość zwracana przez obiekt Future
, niepożądane jest aktywne oczekiwanie na wartość. Aby tego uniknąć, obiekt wraz z kodem dalszego przetworzenia zostają złożone do FutureProcessor
Metoda addFutureProcess(condition: Future, process: Runnable)
dodaje warunek i kod do zbioru oczekujących akcji.
tryProcessAll()
sprawdza dla każdej akcji Future.isReady()
. Następnie dla gotowych obiektów uruchamia kod dalszego przetwarzania.
HeartBeatEmiter
Kontroluje częstotliwość emitowania wiadomości heart beat. Generuje odpowiednią wiadomość.
MessageProcessContext
Zawiera obiekty, na które może wpłynąć przetworzenie wiadomości.