Sto cercando di assicurarmi che la mia applicazione Java adotti misure ragionevoli per essere robusta, e parte di ciò comporta lo spegnimento con grazia. Sto leggendo degli hook di arresto e in realtà non capisco come usarli in pratica.
C'è un esempio pratico là fuori?
Diciamo che avevo un'applicazione molto semplice come questa qui sotto, che scrive i numeri su un file, 10 su una riga, in batch di 100, e voglio assicurarmi che un determinato batch finisca se il programma viene interrotto. Ottengo come registrare un hook di spegnimento ma non ho idea di come integrarlo nella mia applicazione. Eventuali suggerimenti?
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();
}
}
}