Run background task in servlet application
This is an example of simulating a background task, and it runs underground under your servlet application. Specifically, on a certain time, it creates the sitemap.xml file which is located in the original directory of the web application.

 
package com.o7planning.example.servlet.listener;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class SiteMapGenerator implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        Runnable command = new SiteMapThread(event.getServletContext());
        // Delay 1 Minute to first execution
        long initialDelay = 1;
        TimeUnit unit = TimeUnit.MINUTES;
        // period the period between successive executions
        long period = 60;// 60 Minute!

        scheduler.scheduleAtFixedRate(command, initialDelay, period, unit);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>ServletListenerExample</display-name>



    <listener>
        <listener-class>com.o7planning.example.servlet.listener.SiteMapGenerator</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>
package com.o7planning.example.servlet.listener;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletContext;

public class SiteMapThread implements Runnable {

    private ServletContext context;

    public SiteMapThread(ServletContext context) {
        this.context = context;
    }

    @Override
    public void run() {
        System.out.println("Generate sitemap ... " + new Date());

        try {
            this.createFile();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Finish generation");
    }

    private void createFile() throws IOException {
        System.out.println("Generate file sitemap.xml to: "
                + context.getRealPath(""));
        String path = context.getRealPath("sitemap.xml");
        File file = new File(path);
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        writer.write("<?xml version='1.0' ?>");
        writer.write("<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9' "
                + " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'  "
                + " xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>");
        //
        writer.write("<url>");
        writer.write("<loc>http://o7planning.org</loc>");
        writer.write("<changefreq>daily</changefreq>");
        writer.write("<priority>0.80</priority>");
        writer.write("</url>");
        //
        writer.write("<url>");
        writer.write("<loc>http://o7planning.org/index.html</loc>");
        writer.write("<changefreq>daily</changefreq>");
        writer.write("<priority>0.80</priority>");
        writer.write("</url>");
        //
        writer.write("</urlset>");
        writer.close();
    }

}