package cn.jcenterhome.service; import java.io.File; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.jcenterhome.dao.DataBaseDao; import cn.jcenterhome.util.BeanFactory; import cn.jcenterhome.util.Common; import cn.jcenterhome.util.FileHelper; import cn.jcenterhome.util.JavaCenterHome; public class CronService { public synchronized void runCron(HttpServletRequest request, HttpServletResponse response, int cronid) throws Exception { String where = "cronid='" + cronid + "'"; runCron(request, response, where); } public synchronized void runCron(HttpServletRequest request, HttpServletResponse response) throws Exception { Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal"); String where = "available>'0' AND nextrun<='" + sGlobal.get("timestamp") + "'"; runCron(request, response, where); } private void runCron(HttpServletRequest request, HttpServletResponse response, String where) throws Exception { DataBaseDao dataBaseDao = (DataBaseDao) BeanFactory.getBean("dataBaseDao"); List<Map<String, Object>> query = dataBaseDao.executeQuery("SELECT * FROM " + JavaCenterHome.getTableName("cron") + " WHERE " + where + " ORDER BY nextrun LIMIT 1"); if (query.size() > 0) { Map<String, Object> cron = query.get(0); cronRunning(request, response, cron); } cron_config(request); } private void cronRunning(HttpServletRequest request, HttpServletResponse response, Map<String, Object> cron) { String scripFileName = (String) cron.get("filename"); String cronFilePath = JavaCenterHome.jchRoot + "./source/cron/" + scripFileName; File cronFile = new File(cronFilePath); if (!cronFile.exists()) { DataBaseService dataBaseService = (DataBaseService) BeanFactory.getBean("dataBaseService"); Map<String, Object> setarr = new HashMap<String, Object>(); setarr.put("available", 0); Map<String, Object> whereSQLArr = new HashMap<String, Object>(); whereSQLArr.put("cronid", cron.get("cronid")); dataBaseService.updateTable("cron", setarr, whereSQLArr); FileHelper.writeLog(request,"CRON", cron.get("name") + " : Cron script(" + cron.get("filename") + " not found"); return; } cronNextRun(request, cron); RequestDispatcher dispatcher = request.getRequestDispatcher("/source/cron/" + scripFileName); try { dispatcher.include(request, response); } catch (Exception e) { FileHelper.writeLog(request,"CRON", cron.get("name") + " : Cron script(" + cron.get("filename") + " exception: " + e.getMessage()); } } public synchronized void cron_config(HttpServletRequest request) throws Exception { DataBaseDao dataBaseDao = (DataBaseDao) BeanFactory.getBean("dataBaseDao"); List<Map<String, Object>> query = dataBaseDao.executeQuery("SELECT nextrun FROM " + JavaCenterHome.getTableName("cron") + " WHERE available>'0' ORDER BY nextrun LIMIT 1"); int nextrun = query.size() > 0 ? (Integer) (query.get(0).get("nextrun")) : 0; DataBaseService dataBaseService = (DataBaseService) BeanFactory.getBean("dataBaseService"); Map<String, Object> insertsqlarr = new HashMap<String, Object>(); insertsqlarr.put("var", "cronnextrun"); insertsqlarr.put("datavalue", nextrun); dataBaseService.insertTable("config", insertsqlarr, false, true); CacheService cacheService = (CacheService) BeanFactory.getBean("cacheService"); cacheService.config_cache(false); } public synchronized boolean cronNextRun(HttpServletRequest request, Map<String, Object> crons) { if (Common.empty(crons)) return false; Map<String, Object> sConfig = (Map<String, Object>) request.getAttribute("sConfig"); Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal"); String minute = (String) crons.get("minute"); Map<String, Object> setarr = new HashMap<String, Object>(); if (minute.equals("")) { setarr.put("available", 0); } else { short hour = Short.parseShort(String.valueOf(crons.get("hour"))); short day = Short.parseShort(String.valueOf(crons.get("day"))); byte weekDay = Byte.parseByte(String.valueOf(crons.get("weekday"))); Calendar calendar = Common.getCalendar(String.valueOf(sConfig.get("timeoffset"))); calendar.set(Calendar.SECOND, 0); Date date = calendar.getTime(); String[] minuteArray = minute.split("\t"); int minuteLengh = minuteArray.length; int[] minuteIntArray = new int[minuteLengh]; for (int i = 0; i < minuteLengh; i++) { minuteIntArray[i] = Integer.parseInt(minuteArray[i]); } Arrays.sort(minuteIntArray); int nowMinute = calendar.get(Calendar.MINUTE); int minMinute = 0; int maxMinute = 0; int nextRunM = 0; if (minuteLengh > 0) { minMinute = minuteIntArray[0]; maxMinute = minuteIntArray[minuteLengh - 1]; } if (nowMinute >= maxMinute) { nextRunM = minMinute; if (hour == -1) { calendar.add(Calendar.HOUR_OF_DAY, 1); } } else { for (int tempMinute : minuteIntArray) { if (tempMinute > nowMinute) { nextRunM = tempMinute; break; } } } calendar.set(Calendar.MINUTE, nextRunM); if (hour > -1) { calendar.set(Calendar.HOUR_OF_DAY, hour); if (!calendar.getTime().after(date) && weekDay == -1 && day == -1) { calendar.add(Calendar.DAY_OF_YEAR, 1); } } if (weekDay > -1) { calendar.set(Calendar.DAY_OF_WEEK, weekDay + 1); if (!calendar.getTime().after(date)) { calendar.add(Calendar.WEEK_OF_MONTH, 1); } } else { if (day > -1) { calendar.set(Calendar.DAY_OF_MONTH, day); if (!calendar.getTime().after(date)) { calendar.add(Calendar.MONTH, 1); } } } int nextrun = (int) (calendar.getTimeInMillis() / 1000); int timestamp = (Integer) sGlobal.get("timestamp"); setarr.put("lastrun", timestamp); setarr.put("nextrun", nextrun); if (nextrun <= timestamp) { setarr.put("available", 0); } } DataBaseService dataBaseService = (DataBaseService) BeanFactory.getBean("dataBaseService"); Map<String, Object> whereSQLArr = new HashMap<String, Object>(); whereSQLArr.put("cronid", crons.get("cronid")); dataBaseService.updateTable("cron", setarr, whereSQLArr); return true; } }