Pro simulaci problémů, se kterými se můžete setkat při implementaci distribuovaných systémů, budeme používat v rámci předmětu framework DSand. Tento framework nevykonává řešení skutečně na více počítačích, nicméně nám umožňuje simulovat některé ze standartních problémů, které mohou nastat, konkrétně například:

Vaším úkolem bude implementovat logiku procesů (potomků třídy DSProcess), návod k frameworku je proto koncipován z pohledu procesů.


Architektura simulace

Simulace distribuovaného systému běží na jediném počítači a jediném vláknu. Jednotlivé procesy jsou proto probouzeny simulací (je zavolána metoda act() procesu) a dostávají tak čas na vykonání potřebné práce (především zpracování a odeslání zpráv). Vzhledem k tomu, že procesy neběží současně, musí proto metoda act() vždy skončit v konečném (krátkém) čase!

Procesy jsou ve frameworku reprezentovány instancemi třídy odděděné od třídy cz.cvut.fel.agents.pdv.dsand.DSProcess. Každý proces je identifikován v rámci simulace podle svého identifikátoru (String), který slouží i jako cílová adresa při zasílání zpráv. Identifikátor aktuálního procesu můžete zjistit z atributu id procesu. Často při implementaci pořebujete znát i identifikátory ostatních procesů, se kterými budete komunikovat - ty vám typicky předáváme v konstruktoru potomka třídy DSProcess, který máte za úkol implementovat.

Pro zasílání zpráv používejte metodu send(String rcpt, Message message). rcpt je identifikátor procesu, kterému chcete zprávu zaslat, message je instance zprávy, kterou chcete zaslat. Zprávy si můžete naimplementovat vlastního typu, avšak musíte dodržet, že zprávy dědí od třídy cz.cvut.fel.agents.pdv.dsand.Message a musí obsahovat pouze atributy, které jsou serializovatelné. Pokud je aktuálnímu procesu doručena zpráva, je umístěna do jeho fronty inbox (java.util.Queue). Doporučujeme vám v každé iteraci (při každém vykonání metody act(…)) zpracovat všechny zprávy v inbox – v opačném případě může dojít k zahlcení systému nepřečtenými zprávami.

V případě, že chcete simulaci ukončit (a tím ukončit běh aplikace), můžete zavolat metodu terminateAll().


Nastavení a průběh simulace

Průběh simulace je parametrizovaný instancí třídy cz.cvut.fel.agents.pdv.dsand.DSConfig (respektive jejího potomka).