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/scheduler
Make 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.