On previous projects I have used Spring Framework's scheduling integration, which provides convenience classes for Quartz. This worked well, but a good alternative on Unix-like systems is to use cron.
Here are the steps to get something simple working:
1. Open a terminal and log in to your server
2. Open your crontab for editing:
crontab -e
3. Add a line like this in your crontab:
* * * * * wget -O /tmp/your-domain_scheduler_out http://your-domain.com/schedulerMake sure you enter the correct domain name. Using localhost will work in some cases, depending on your server's configuration.
4. Now you need to create your scheduler servlet:
// Accessed using path: /scheduler public class SchedulerServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { // Invoke your scheduler service - something you will need to implement SchedulerService.getInstance().doTasks(); response.setContentType("text/plain"); PrintWriter out = response.getWriter(); // Write the current date/time to the response out.println((new Date()).toString() + " :: Scheduler invoked"); out.close(); } }5. Update your web.xml:
<servlet> <servlet-name>schedulerServlet</servlet-name> <servlet-class>com.your-domain.some.path.SchedulerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>schedulerServlet</servlet-name> <url-pattern>/scheduler</url-pattern> </servlet-mapping>6. Deploy and test:
Compile your serlvet, reload your application and make sure your scheduler servlet works. If the cron job is working correctly you should see the scheduler_out file in your /tmp directory (which will be updated every minute).
7. Improvements for production deployment:
You should consider doing the following before deploying in a production environment:
- Secure the scheduler servlet by restricting access to the local IP address
- Instead of invoking wget directly in your crontab, you could invoke a shell script
- Handle exceptions and maintain a log file
- Decide how often the scheduler should run and change your cron entry accordingly.