Ich versuche sicherzustellen, dass meine Java-Anwendung angemessene Schritte unternimmt, um robust zu sein. Dazu gehört auch das ordnungsgemäße Herunterfahren. Ich lese über Shutdown-Hooks und verstehe nicht, wie ich sie in der Praxis einsetzen kann.
Gibt es da draußen ein praktisches Beispiel?
Angenommen, ich hatte eine wirklich einfache Anwendung wie die folgende, die Zahlen in eine Datei schreibt, 10 in eine Zeile, in Stapeln von 100, und ich möchte sicherstellen, dass ein bestimmter Stapel beendet wird, wenn das Programm unterbrochen wird. Ich kann einen Shutdown-Hook registrieren, habe aber keine Ahnung, wie ich ihn in meine Anwendung integrieren kann. Irgendwelche Vorschläge?
package com.example.test.concurrency;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class GracefulShutdownTest1 {
final private int N;
final private File f;
public GracefulShutdownTest1(File f, int N) { this.f=f; this.N = N; }
public void run()
{
PrintWriter pw = null;
try {
FileOutputStream fos = new FileOutputStream(this.f);
pw = new PrintWriter(fos);
for (int i = 0; i < N; ++i)
writeBatch(pw, i);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
finally
{
pw.close();
}
}
private void writeBatch(PrintWriter pw, int i) {
for (int j = 0; j < 100; ++j)
{
int k = i*100+j;
pw.write(Integer.toString(k));
if ((j+1)%10 == 0)
pw.write('\n');
else
pw.write(' ');
}
}
static public void main(String[] args)
{
if (args.length < 2)
{
System.out.println("args = [file] [N] "
+"where file = output filename, N=batch count");
}
else
{
new GracefulShutdownTest1(
new File(args[0]),
Integer.parseInt(args[1])
).run();
}
}
}