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!