perpetum mobile dzięki pluginom

0

Witam.
Zastanawiam się jak zrobić desktopową aplikację, której działanie i przeznaczenie było by całkowicie uzależnione od załadowanych pluginów.
Uruchomiłem taki przykład jak stworzyć aplikację opartą o pluginy:
http://www.solitarygeek.com/java/a-simple-pluggable-java-application/
generalnie to dodawanie nawet całych aplikacji jako pluginy okazało się proste :)

Ale do rzeczy. Problemem jest by aplikacja zawsze działała, a jednocześnie można było aktualizować jej główny moduł. O ile poszczególne komponenty są "wyczepialne" ( w zamyśle wiem jak to zrobić ) to nie mam pojęcia jak podmieniać na gorąco główny moduł.
Chodzi mi po głowie coś takiego.

  • Mam moduł główny A01
  • tworzę moduł A02 jako aktualizację i ładuje go jako plugin do A01 (jak zwykły plugin lub osobnym kanałem)
  • jak A02 ma przejąć kontrolę i wyłączyć moduł A01, by można go było bezpiecznie usunąć?

Javą głębiej interesuję się od niedawna i nie bardzo wiem jak to rozwiązać.
Mój pomysł:

  • uruchomienie modułu A02 jako osobnego wątku ( wystarczy zwykły, czy jakiś specjalny?)
  • przejęcie wszystkich informacji o załadowanych modułach metodą: pojedynczo włączam w A02 i wyłączam w A01 (na raz mogło by pewnie nieźle zamulić)
  • wyłączenie wątku odpowiedzialnego za istnienie modułu A01, tyle że tak by nie nastąpiło razem z nim wyłączenie wątku A02

Mam wyjątkowo blade pojęcie jak się do tego zabrać. Prosiłbym o jakieś wskazówki, pomysły, przemyślenia ...gotowy kod ;P

0

Popatrz sobie na technologię OSGi. To działa bardzo podobnie do tego co opisałeś. na OSGi chodzi chociażby Eclipse.

0

No nie zupełnie, albo ja czegoś nie doczytałem. OSGi bardzo ładnie implementuje on/off pluginów, ale to o co mi chodziło w pytanie to przez analogię, było by na gorąco podmienianie samego OSGi. Chcę podmienić główną klasę z metodą "main", sam korzeń/jądro aplikacji. Takiego przykładu nie udało mi się dotąd znaleźć ani w javie, ani w c/c++ co mnie notabene również interesuje. Ewentualnie musiał by być to program, który jest uruchamiany osobno i niejako "podkrada" działające pluginy pierwszej aplikacji, by na końcu ją wyłączyć.

0

Jeżeli nie chcesz mieć metody "main" na stosie wywołań, to pozostają dwa wyjścia:

  1. Wątki.
public class Test {
	public static void main(String args[]) {
		new Thread() {
			public void run() {
				System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
			}
		}.start();
	}
}
  1. Blok inicjazlizacji statycznej. Poniższy program działa poprawnie, mimo że nie ma metody main. Wystarczy zrobić "javac Test2.java", następnie "java Test2" i pójdzie.
public class Test2 {
	static {
		System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
		System.exit(0);
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1