Windowsshutdown abfangen

wizkid

Grünschnabel
Also, folgendes suche ich.

Ich möchte gerne mit einem Java Programm den Windowsshutdown abfangen, damit ich vor dem Herunterfahren des Rechners noch einige Daten sichern kann. ( 10 kb ).

Geht das
 
kann ich mir nicht vorstellen.

windows steuert die JRE
JRE steuert dein Programm

Dein Programm müsste also aus der JRE ausbrechen um auf Windows zu reagieren und letztlich Windows zu steuern.
Und das widerspricht allen Prinzipien von Java
 
Hi,

wenn es nicht in Java funktioniert, starte doch eine Batch-Datei:


Code:
shutdown -a

Cooler Tip - aber ich glaub auf ne andere Frage :-)

Das Problem bleibt bestehen - wie breche ich aus der JRE aus um auf Windows-Events zu reagieren.

Dein Beispiel ist gut um Windows per Java runterzufahren - für mehr aber auch nicht
 
Hi !

Sowas geht meiner Meinung nach (nur) über JNI !

Du könntest in einem C++-Programm das Event abfangen, den Shutdown verhindern und evtl. ein Java-Event auslösen ...

Geht bestimmt, einen Codeschnipsel besitze ich leider nicht. Ausserdem ist das ganze dann Plattform abhängig ...

Krösi
 
Hallo!

Also du könntest einen Shutdown-Hook verwenden um zu erkennen wann dein Java Prozess beendet wird... alternativ dazu könnte man auch mit einem SignalHandler auf entsprechende OS-Signale reagieren... ich würde jedoch die Shutdown-Hook Methode vorziehen.

Java:
/**
 * 
 */
package de.tutorials;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;

import sun.misc.Signal;
import sun.misc.SignalHandler;

/**
 * @author Thomas.Darimont
 *
 */
public class ShutdownAwareJavaExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        System.out.println("Running...");
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run() {
                try {
                    System.out.println("[ShutdownHook] Shutdown detected!");
                    PrintWriter printWriter = new PrintWriter(new FileWriter("c:/shutdown_hook.log"));
                    printWriter.println("EXIT @ " +  System.currentTimeMillis());
                    printWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        
        Signal.handle(new Signal("TERM"), new SignalHandler(){
            public void handle(Signal arg0) {
                try {
                    System.out.println("Shutdown detected!");
                    PrintWriter printWriter = new PrintWriter(new FileWriter("c:/shutdown.log"));
                    printWriter.println("EXIT @ " +  System.currentTimeMillis());
                    printWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        
        try {
            TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

Gruß Tom
 
Zurück