Mi az a SAL?
A SAL a Shared Access Layer rövidítése. Segítségével Atlassian termékfüggetlen plugin kód írható, azaz nem kifejezetten a JIRA vagy Confluence alatt működő, hanem mindkettő által használható közös elem lehet (pl: időzített feladatok).
Ismétlődő feladatok kezelése
Az időzített taszkok egy felhasználási módját megmutatja a JIRA scheduling példa, amit kisebb átalakítással a Todo példánkba is felhasználhatunk. Akkor érdemes ilyen időzítést használunk, ha nagy számítás vagy időigényű háttérfeladatot futtatunk vagy nincs jelentősége az eredmény azonnali megjelenítésének (pl: nagy adathalmazok összefésülése, rendszer monitorozás), esetleg egy bizonyos feladatot időponthoz kötötten vagy ismételődően kell megvalósítanunk (pl: éjszakai adatátadások). A saját példába átültetett kód által végzett feladat nem ilyen, csak az időzítés bemutatását szolgálja.
JIRA scheduling
A plugin SDK ad egy alap szerkezetet az időzítés implementálásához, így nem kell Quartz job-okat megírnunk, hanem használhatjuk a belső megoldásokat. A Todo példában beállítunk egy percenkénti ismétlődést, ami létrehoz egy új rekordot a Todo táblában, majd az INFO logba kiírja, hogy lefutott a taszk. A TodoTask végzi az ismétlődő feladatot, a TodoMonitorImpl pedig időzít és eltárolja az esetleges eredményeket.
TodoTask.java
public class TodoTask implements PluginJob { private final static Logger logger = LoggerFactory.getLogger(TodoTask.class); @Override public void execute(Map<String, Object> jobDataMap) { final TodoMonitor monitor = (TodoMonitor) jobDataMap.get("TodoMonitorImpl:instance"); final TodoService service = (TodoService) jobDataMap.get("TodoService"); Date now = DateTime.now().toDate(); service.create("TodoTask description " + now.getTime()); monitor.setLastRun(now); logger.info("TodoTask executed at " + monitor.getLastRun()); } }
TodoMonitorImpl.java
public class TodoMonitorImpl implements TodoMonitor, LifecycleAware { private final static Logger logger = LoggerFactory.getLogger(TodoMonitorImpl.class); private static final String JOB_NAME = TodoMonitorImpl.class.getName() + ":job"; private static final long INTERVAL = DateTimeConstants.MILLIS_PER_MINUTE; private final PluginScheduler pluginScheduler; private TodoService todoService; private Date lastRun; private HashMap<String, Object> jobDataMap = new HashMap<String, Object>(); public TodoMonitorImpl(PluginScheduler pluginScheduler, TodoService todoService) { this.pluginScheduler = pluginScheduler; this.todoService = todoService; } @Override public void schedule() { jobDataMap.put("TodoMonitorImpl:instance", TodoMonitorImpl.this); jobDataMap.put("TodoService", todoService); Date startTime = DateTime.now().toDate(); pluginScheduler.scheduleJob(JOB_NAME, TodoTask.class, jobDataMap, startTime, INTERVAL); logger.info(String.format("TodoMonitorImpl scheduled to run every %d ms", INTERVAL)); } @Override public void onStart() { schedule(); } @Override public void setLastRun(Date lastRun) { this.lastRun = lastRun; } @Override public Date getLastRun() { return lastRun; } }
[INFO] hu.lacimol.tutorial.todo.scheduling.TodoMonitorImpl - TodoMonitorImpl scheduled to run every 60000 ms [INFO] Starting Coyote HTTP/1.1 on http-2990 [DEBUG] net.java.ao.sql - INSERT INTO AO_595B84_TODO (ID) VALUES (NULL) [DEBUG] net.java.ao.sql - UPDATE PUBLIC.AO_595B84_TODO SET DESCRIPTION = ?,COMPLETE = ? WHERE ID = ? [INFO] hu.lacimol.tutorial.todo.scheduling.TodoTask - TodoTask executed at Wed Jul 17 21:07:53 CEST 2013 [INFO] Server startup in 68986 ms [INFO] Tomcat 6.x started on port [2990] [INFO] jira started successfully in 113s at http://Laci-PC:2990/jira [INFO] Type Ctrl-D to shutdown gracefully [INFO] Type Ctrl-C to exit [DEBUG] net.java.ao.sql - INSERT INTO AO_595B84_TODO (ID) VALUES (NULL) [DEBUG] net.java.ao.sql - UPDATE PUBLIC.AO_595B84_TODO SET DESCRIPTION = ?,COMPLETE = ? WHERE ID = ? [INFO] hu.lacimol.tutorial.todo.scheduling.TodoTask - TodoTask executed at Wed Jul 17 21:08:52 CEST 2013
Az eredmény
Két perc futás után a lenti lista két új elemmel bővült:
A fenti módosítások letölthetők SVN-en keresztül és becsomagolva a blog GoogleCode oldaláról a JiraDevTutor projektből.