JavaFX RMI extrem langsam wenn Server nicht läuft

EvoLutionX

Mitglied
Hallo zusammen,

für meine GUI erhalte ich Daten über RMI von einem Server. Im worst case 60 mal/Sekunde.
Wenn der Server läuft, dann funktioniert alles wie es soll. Starte ich allerdings das GUI ohne dass der Server läuft, dann wird alles extrem langsam. Für diesen Fall habe ich eine Exception Klasse, die alle notwendigen Daten bereitstellt damit das Programm fehlerfrei weiterlaufen kann.
Ich vermute, dass der Versuch eine Verbindung aufzubauen einfach zu lange dauert, und in diesem Zeitraum das Programm nichts anderes mehr macht. Aber mir fällt gerade keine Möglichkeit ein das zu umgehen?
Zweite Frage: Wenn ich das Serverprogramm per Menüleiste ("x") schließe, dann läuft trotzdem noch irgend ein Prozess weiter. Hinterher muss ich dann in der Netbeans Leiste nochmal "x" anklicken damit das Programm komplett geschlossen ist. Woran könnte dennn das liegen?

Hier mal der Code für den Serverzugriff (der wird vom GUI über AnimationTimer aufgerufen, die die Daten dann darstellen):
Java:
    public static RMI rmiConnect() {
       try{
           Registry reg = LocateRegistry.getRegistry("127.0.0.1", 1099);
           RMI rmi = (RMI) reg.lookup("server");
           return rmi;
       } catch(RemoteException | NotBoundException e){
           System.out.println(e);
           return null;
       }
    }

     public static Map<String, ValuePair> getAllSignals(String vin, String filter) throws RemoteException, IOException {
     try {
          RMI rmi = rmiConnect();
          Map<String, double> signals = rmi.getAllSignals();
          return (Map<String, double>) signals;
      } catch (Exception ex) {
          ExceptionsHandling exception = new ExceptionsHandling();
          Map<String, double> list = exception.failedSignalsQuery();
          return list;
      }
 }
 
So ich bin mittlerweile schon etwas weiter gekommen.
Die einzige Möglichkeit ist wohl die Abfrage in einen seperaten Thread auszulagern. Was ich also vor habe ist, die Methode rmiConnect() in einem seperaten Thread laufen zu lassen.
Das funktioniert so weit auch und mein Programm läuft wie gewünscht.

Folgender Code liefert auch das gewünschte Ergebnis:
Java:
 public static void serverLookup() {   
   Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("Current thread: " + Thread.currentThread());
                    rmiConnect();
                } catch (IOException ex) {
                    Logger.getLogger(ServerQuery.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        t1.start();
    }

Das Problem:
Die Ausgabe des Current Threads liefert nach einiger Zeit:
Code:
Current thread: Thread[Thread-550,5,main]
Die Nummer wird also immer größer.
Heißt das jetzt, dass da immer ein neuer Thread erstellt wird? Ich will eig. nur einen Thread t1 erstellen in dem das immer gemacht wird.
 
muss ich aber dann, wenn ich beim Start keine Serververbindung habe, weil ich ja immer wieder überprüfen muss ob die Serververbindung dann irgendwann steht.
 
Anstatt durchgängig neue Threads zu starten, kannst du einfach den einen so lange laufen lassen, bis die Verbindung hergestellt wurde.

Einfach ne neue Methode, die den try-catch-Block in einer Schleife laufen lässt, und diese im Thread ausführen
 

Zurück
Oben