Buongiorno, metto subito le mani avanti dicendo che ho già cercato sia tramite Google che nel forum ed ho visto che l'argomento è trattato ampiamente ma tutto ciò che ho provato non funziona nel mio caso.
La mia applicazione è un web service che espone diversi servizi tra cui la possibilità di impostare un periodo di ripetizione per i backup. In pratica quando il periodo impostato scade viene effettuato un backup del DB che viene salvato in una cartella appositamente creata.
Per fare questa operazione ho utilizzato le classi Timer e TimerTask in questo modo:
codice:
public class BackupAutomaticoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Date delay;
private Long tempo;
public BackupAutomaticoServlet(Date delay, Long tempo) {
super();
this.delay=delay;
this.tempo=tempo;
}
public void init(){
Timer autoBackup=new Timer();
if(delay!=null) autoBackup.scheduleAtFixedRate(BackupAutomaticoTask.getSingleton(), delay, tempo);
else autoBackup.scheduleAtFixedRate(BackupAutomaticoTask.getSingleton(), 0, tempo);
}
private static class BackupAutomaticoTask extends TimerTask{
private String dbName;
private String host;
private static BackupAutomaticoTask istanza;
public BackupAutomaticoTask(){
String[] s=SystemManager.URL_DB.split("/");
host=s[0];
dbName=s[1];
}
public void eseguiBackup(){
try {
SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
String dataFormattata=sdf.format(new Date());
SimpleDateFormat sdf2=new SimpleDateFormat("HH mm");
String oraFormattata=sdf2.format(new Date());
System.out.println(oraFormattata);
System.out.println(dataFormattata);
String path = "backup/crm_backup_";
path+=dataFormattata;
path+="_"+oraFormattata;
path+=".backup";
ProcessBuilder pb = new ProcessBuilder("pg_dump", "-h", host, "-Fc", "-f", path, "-U", SystemManager.USERNAME_DB, dbName);
pb.start();
SystemManager.salvaConfUltimoBackup(dataFormattata, oraFormattata);
} catch (IOException e) {
e.printStackTrace();
SystemManager.logger.info(e.getMessage());
}
}
@Override
public void run() {
try {
DateFormat formatter=new SimpleDateFormat("HH.mm");
Calendar orarioRipetizioneBackup=Calendar.getInstance();
orarioRipetizioneBackup.setTime(formatter.parse(SystemManager.ORARIO_RIPETIZIONE_BACKUP));
Calendar orarioAttuale=Calendar.getInstance();
orarioAttuale.setTime(formatter.parse(formatter.format(new Date())));
if(orarioAttuale.compareTo(orarioRipetizioneBackup)>=0){
System.out.println("Inizio backup");
this.eseguiBackup();
System.out.println("Metodo eseguiBackup eseguito");
}
} catch (ParseException e) {}
}
public static BackupAutomaticoTask getSingleton(){
if(istanza==null) {
istanza=new BackupAutomaticoTask();
}
return istanza;
}
}
}
Scrivo qui perchè ovviamente non vuole saperne di funzionare...
Ora come ora il backup viene eseguito una sola volta dopodichè avviene un crash e tomcat fa il restart dell'applicazione perchè avviene un memory leak.
Ho provato diverse configurazioni del file web.xml:
-loadOnStartup 1
-loadOnStartup 10
-loadOnStartup 100
-senza loadOnStartup
tutto rimane invariato.
Potete illuminarmi su come fare a utilizzare un benedetto TimerTask dentro Tomcat?
Grazie!