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:
Scrivo qui perchè ovviamente non vuole saperne di funzionare...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; } } }
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!

Rispondi quotando
