ScheduledExecutorService problem

a_l_e_x

Mitglied
Guten abend an alle Leser,


bin gerade am verzweifeln, ich steh da irgenwie aufm schlauch.

Wollte ein kleine Programm erstellen, das auf nem VirtellenServer läuft. (Debian & openjdk version "11.0.16" )

ohne gui. bisher hab ich nur Programme erstellt die ne gui hatten.

Ziel ist das das Programm die ganze zeit läuft und in regelmäßigen abständen was prüft und evtl. ne Mail versendet.

Der Teil mit dem Mailversand klappt auch.

jedoch läuft das Progamm nur 2 oder 3 mal (bei 10 min timer ) durch dann scheint es zu stoppen. Glaube da die main methode durchgelaufen ist und nix weiter passiert im Code wird es irgenwie beendet.

Sträube mich ein wenig das mit while (true) {thread.sleep.....} zu lösen.


Java:
private ScheduledExecutorService executor;
private TimerTask repeatedTask_readData;

public static void main(String[] args)
{
    Main main = new Main ();
    main.start();
}

private void start ()
{
    executor = Executors.newScheduledThreadPool(1);

        task = new TimerTask()
        {
            public void run()
            {
                runTask();
            }
        };

        long period = 600000L;       
        executor.scheduleAtFixedRate(task, 0, period, TimeUnit.MILLISECONDS);
}

private void runTask()
{
    //do something
}


für ein Denkanstoß wäre ich sehr dankbar.

Vielen Dank im vorraus.
 
Also generell sieht das richtig aus. Kann es sein, dass irgendwo eine Exception fliegt, die Du nicht abfängst?

Das Verhalten kannst Du nachstellen, z.B. wenn Du es etwas anpasst:
Für Tests den Zeitraum verkleinern: long period = 5000L;
Und dann einfach in runTask reinsetzen:
Java:
    private void runTask()
    {
        System.out.println("Hello world!");
        throw new RuntimeException("Test");
    }

Dann siehst Du ein Verhalten, dass etwas nicht weiter ausgeführt wird.

Der Task könnte z.B. so erweitert werden, um Exceptions ausgegeben zu bekommen:
Java:
        task = new TimerTask()
        {
            public void run()
            {
                try {
                    runTask();
                } catch (Exception ex) {
                    System.out.println("Exception: " + ex.getMessage());
                    ex.printStackTrace();
                }
            }
        };

Damit würde die Exception gefangen und die regelmäßige Ausführung nicht gestoppt. Und Du siehst dann eine Meldung incl. dem Grund für die Exception.
 
Zum Test ist System.out.println noch OK. Wenn das Programm über längere Zeite läuft, dann solltest du über den Einsatz von Logging nachdenken. So hast du eine Art Protokoll was zu welcher Zeit passiert ist. Manche Fehler kann man sonst evtl. nicht mehr nachvollziehen.
Wenn dein Programm auf einer Linux VM läuft, dann könntest du auch darüber nachdenken den Timer über cron zu realisieren. So wird dein Programm immer von außen neu gestartet und läuft auch bei einem Absturz erneut wieder. Ein weitere Vorteil von cron ist, dass dein Programm keinen Speicher verbraucht während es eigentlich nur wartet. Bei einem 10 min Rhythmus ist aber evtl. zweitrangig.
 
Vielen Dank schon mal für eure Antworten.

bin auch ein wenig weitergekommen.

Muss noch weiter testen um alles zu verstehen.

Der try catch block gibt auf der Konsole keine Exception aus, das progamm läuft aber ersten beobachtung zufolge weiter.

als log in ner Datei kommt aber Exception: null , kann ich mir leider nicht wirklich erklären.

in der runTask Methode lese ich nur eine Object von einer Datei ein, alles für sich schon mit try catch .


evtl. liegts auch an der ssh verbindung vom terminal, das programm läuft wohl nur solang die verbinding da ist .
 
Wenn man da Ausgaben hat oder so, die man später sehen will, dann könnte auch screen interessant sein. Da hat man dann sowas wie virtuelle Terminals, zu denen man sich wieder verbinden kann.

man screen
um mehr zu erfahren (und ggf. screen installieren falls noch nicht geschehen).
 
Danke, hab jetzt screen zum starten benutzt.

läuft jetzt seit 24 stunden fehlerfrei durch. Denn Grund für die Exception hab ich auch gefunden (Datei die der ObjectInputStream gelesen hat enthielt das falsche Object)

Mich wundertete nur das "Exception: null" im Log stand also ohne wirklich Message.
 
Evtl. ist irgendwo im Code noch ein try/catch der Art
Java:
try {
...
} catch (Exception e) {
throw new RuntimeException();
}
Sprich, irgendwo weiter unten hat jemand was gefangen und nicht sauber weiter geworfen.
 

Zurück
Oben