Java Timer.schedule runs only once

10,024

You schedule the timer task only once.

The schedule method is defined as

schedule(TimerTask task, long delay)

Schedules the specified task for execution after the specified delay.

But you need to use this method:

schedule(TimerTask task, long delay, long period)

Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.

See Javadocs here: https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html#schedule-java.util.TimerTask-long-long-

Share:
10,024
MarioC
Author by

MarioC

Updated on June 15, 2022

Comments

  • MarioC
    MarioC almost 2 years

    I have a TiimerTask which should run based on a Timer.schedule. The problem is it only runs once when application starts... Maybe it's something pending, but I cannot understand what...

    this is my class which extends TimerTask

    public class ClientScheduler extends TimerTask {
    
        public String serverUrl = Start.getHost();
        public String append = "/client/checkVersion";
        public String numeroClient = null;
        public String actualVersion = null;
        public String filePrefix = "eparkclient-";
        public String fileSuffix = "-jar-with-dependencies.jar";
        private final Logger logger = Logger.getLogger(ClientScheduler.class);
    
        public ClientScheduler() {
    
        }
    
        @Override
        public void run() {
    
    
    
                    logger.debug("Scheduler starts");
                    String finalUrl = null;
                    try {
                         numeroClient = PropertyConfig.getClientId();
    
                         actualVersion = PropertyConfig.getFirmwareVersion();
                         finalUrl = serverUrl + append + "?numeroClient=" + numeroClient;
    
                         HttpConnection http = new HttpConnection();
                         String result = http.getHTTPResponse(finalUrl);
                         JSONObject json = new JSONObject(result);
                         String firmwareVersion = json.getString("firmwareVersion");
                         Boolean updated = json.getBoolean("firmwareUpdated");
    
                         if(!actualVersion.equalsIgnoreCase(firmwareVersion)){
                             //scarico il file dall'ftp
                             FTPDownload ftp = new FTPDownload();
                             String filename = filePrefix+firmwareVersion+fileSuffix;
                             logger.debug("filename è "+filename);
                            boolean success = ftp.getFile(filename);
                             if(success) {
                                //scrivo la versione nuova sul file
                                 PropertyConfig.setFirmwareVersion(firmwareVersion);
                                //comunico al server l'aggiornamento riuscito
                                 HttpConnection answer = new HttpConnection();
                                 String url = serverUrl + "/client/pushUpdate?numeroClient=" + numeroClient + "&firmwareVersion=" +
                                 firmwareVersion + "&updated=0";
    
                                 String r = answer.getHTTPResponse(url);
                                 System.exit(0);
    
                             }
    
    
                         } else if(actualVersion.equalsIgnoreCase(firmwareVersion) && !updated){ //ho riavviato, devo aggiornare il DB
    
                             HttpConnection answer = new HttpConnection();
                             String url = serverUrl + "/client/pushUpdate?numeroClient=" + numeroClient + "&firmwareVersion=" +
                             firmwareVersion + "&updated="+!updated;
    
                             String r = answer.getHTTPResponse(url);
    
                         } else {
                             logger.debug("Non dobbiamo fare niente");
                         }
                    } catch (IOException e) {
                        logger.error("Errore Property", e);
    
                    }
                }
    
        }
    

    The task is called when the application starts in this way

    public static void main(String[] args) throws Exception {
            logger.info("L'ip del client è " + getCurrentIP());
    
            //faccio partire lo scheduler
            logger.debug("Scheduler called");
    
            Timer timer = new Timer();
            timer.schedule(new ClientScheduler(), 10*1000);