Plug-in podejście ramy
Powiedziałeś, że chcesz mieć zamiany hot-code, ale to, czego potrzebujesz, to luźno połączone moduły i zdolność do rozwiązywania problemów w czasie wykonywania. Mówiąc szczerze, pomocna może być dowolna struktura wtyczek, w tym starsze wersje OSGi (zostaną omówione poniżej).
Ponieważ robisz jakąś PoC Proponuję przejrzeć następujący przykład:
- masz meta aplikacji z niektórych punktów rozszerzeń (metaphor explanation) zdefiniowany
- funkcjonalność być zaktualizowane lub zastąpione będą implementowane jako luźno powiązane moduły (wtyczki)
- meta aplikacja wykonuje rozstrzygnięcie na żądanie lub automatycznie w celu znalezienia zaktualizowanej "funkcjonalności" (Zgodnie z określonymi punktami przedłużających)
Mając które definiują simlle uaktualnić scenariusz można zaproponować:
- użytkownik korzysta z aplikacji
- Instaluje użytkownika (kopie) słoiku (inny rodzaj wiązki) z nowa implementacja jednego lub kilku punktów rozszerzeń
- użytkownik wyzwala globalne rozpoznanie systemu lub skanowanie systemu w poszukiwaniu nowych aktualizacji lub wykonania systemu postanawia, że każdy użytkownik urządzenia próbuje uzyskać dostęp do jakiejś funkcjonalności
W taki sposób aplikacja meta będzie mogła zapewnić nową lub zaktualizowaną funkcjonalność bez ponownego uruchamiania.Więc można:
- spróbować użyć jakiś prosty plug-in Java ramy (jak, na przykład, Java Simple Plugin Framework. 5 minutes and it works. No XML. Takie podejście wydaje się być trochę brzydki
- wykorzystanie dynamicznego charakteru Clojure, jak sugerowano here
Możesz również przejrzeć i przyjąć Waterfront (Clojure edytor oparty na Clojure) wnioski (to może być potrzebne w celu wzmocnienia zarządzania cyklem życia, etc)
pod względem wykonania, Wybrzeże opiera się na kontekście wzorca. Pozwala to programom obsługi zdarzeń komunikować się w sposób funkcjonalny ( ) (bez efektu ubocznego). Oprócz tego istnieje mechanizm plug-loader ładujący wtyczki określone w pliku konfiguracyjnym Waterfront o numerze . Oznacza to, że można łatwo dodać funkcjonalność lub usunąć (bardzo przydatne przy debugowaniu!).
podejście OSGI
Jak sugerowano OSGi wydaje się być dobrym sposobem na rozwiązanie problemu. Należy również pamiętać, OSGi jest dobry, dojrzały i dostarcza wielu rzeczy po wyjęciu z pudełka, ale jest również nieco skomplikowane:
BTW, OSGi jest długoterminowym celem dla społeczności Clojure. Można sprawdzić Clojure Todo:
> better modularization for OSGi etc
> * names
> * no single namespace pool
> * namespaces found via classes, thus tracks classloader and modules
> * deal with import proxying a la Class.forName stack walk?
Istnieją pewne rozwiązania już dostępne:
- clojure-osgi-utils
- clojure.osgi
Drugi projekt świadczy przykład Producent konsumentów za pomocą Clojure i OSGi:
Szczęśliwy kodowania.
Myślę, że ** znacznie ** łatwiej będzie zrestartować klienta. Dlaczego nie możesz go ponownie uruchomić? –
@NikitaBeloglazov Jeśli chodziło o ładowanie kodu podczas rozwijania, chciałbym ładować źródła lub restartować. Ale chciałbym zamienić coś w stylu erlangu na wymianę kliencką dla aplikacji klienckiej. I tak, wiem, że to nie jest dobre i może łatwo zawiesić mój program, ale jest to coś, co chcę wypróbować. – desudesudesu