Данный планировщик представляет собой простейшее Web-приложение и будет выполнять задачу через каждые 5 секунд, а задача при выполнении будет писать в лог строку с временем выполнения (никто не запрещает сделать более сложную логику). А так же будет создан сервлет для управления заданием (действия - остановить выполнение и запустить выполнение). Более того при создании не будут использоваться внешние библиотеки, только те которые есть в Weblogic Server.
- Открываем Oracle JDeveloper и создаём новое приложение (с именем SampleScheduler):
- Затем добавляем в проект необходимые библиотеки.
- Создаём новый класс для описания задания(с именем HelloWorldJob):
Следует обратить внимание на выделенное красным, это те классы которые должны быть имплементированы и методы которые должны быть реализованы (один при срабатывании задачи и другой для отмены/остановки задачи). Инициализацию задания можно вынести в конструктор.package com.blogspot.stan1slav.sample.jobs; import commonj.timers.CancelTimerListener; import commonj.timers.Timer; import commonj.timers.TimerListener; import java.io.Serializable; import java.util.Date; public class HelloWorldJob implements Serializable, TimerListener, CancelTimerListener { private Date timerDate = null; public HelloWorldJob() { super(); } public void timerExpired(Timer timer) { timerDate = new Date(timer.getScheduledExecutionTime()); System.out.println("HelloWorldJob timer expired called on " + timerDate); } public void timerCancel(Timer timer) { timerDate = new Date(timer.getScheduledExecutionTime()); System.out.println("HelloWorldJob timer cancelled called on " + timerDate); } }
- Создаём сервлет для старта/остановки задания, а так же автозапуска:
package com.blogspot.stan1slav.sample; import com.blogspot.stan1slav.sample.jobs.HelloWorldJob; import commonj.timers.Timer; import commonj.timers.TimerManager; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.naming.InitialContext; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class JobsServlet extends HttpServlet { private Timer helloWorldJobTimer = null; private TimerManager tm = null; public void init(ServletConfig config) throws ServletException { super.init(config); System.out.println("InitJobsServlet is initialized "); try { InitialContext ic = new InitialContext(); tm = (TimerManager)ic.lookup("java:comp/env/tm/TimerManager"); helloWorldJobTimer = tm.schedule(new HelloWorldJob(), new Date(), 5000); //5 seconds } catch (Exception ne) { ne.printStackTrace(); } } public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<h4>JobsServlet is working!</h4>"); String cmd = req.getParameter("cmd"); if (cmd != null && cmd.equals("cancel") && helloWorldJobTimer != null) { helloWorldJobTimer.cancel(); helloWorldJobTimer = null; } if (cmd != null && cmd.equals("start") && helloWorldJobTimer == null) { helloWorldJobTimer = tm.schedule(new HelloWorldJob(), new Date(), 5000); } if (helloWorldJobTimer != null) { out.println("<h6>HelloWorldJob started</h6>"); } else { out.println("<h6>HelloWorldJob calceled</h6>"); } } }
- В web.xml прописать ссылку на ресурс (т.е. на наш TimerManager):
<?xml version = '1.0' encoding = 'UTF-8'?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <servlet> <servlet-name>JobsServlet</servlet-name> <servlet-class>com.blogspot.stan1slav.sample.JobsServlet</servlet-class> <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JobsServlet</servlet-name> <url-pattern>/jobsservlet</url-pattern> </servlet-mapping> <resource-ref> <res-ref-name>tm/TimerManager</res-ref-name> <res-type>commonj.timers.TimerManager</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Unshareable</res-sharing-scope> </resource-ref> </web-app>
- Деплоим на сервер (как WAR-архив) и проверяем работоспособность (смотрим в out-лог сервера)
- Задание выполняется после деплоя:
- С использованием сервлета остановим выполнение задания (для этого при вызове добавляем ?cmd=cancel):
- В логе появилась запись об остановке (отмене) задания:
- С использованием сервлета стартуем снова задание (для этого при вызове добавляем ?cmd=start):
- В логе появились записи о выполнении задания: