java定时任务管理实现-quartz

28 篇文章 0 订阅
12 篇文章 0 订阅

Java代码   收藏代码
  1. 代码清单:   
  2. ==============================SQL====================================   
  3. 计划任务表   
  4. ==============================定时任务模块类====================================   
  5. 计划管理DAO接口 CmsSchedulerDao.java   
  6. 计划管理DAO接口实现类 CmsSchedulerDaoImpl.java   
  7. 计划任务管理服务接口 CmsSchedulerMng.java   
  8. 计划任务管理服务接口实现类 CmsSchedulerMngImpl.java   
  9. 定时任务管理接口 SchedulerTaskManageSvc.java   
  10. 定时任务管理接口实现类 SchedulerTaskManageSvcImpl.java   
  11. 定时任务接口 SchedulerTaskSvc.java   
  12. 定时任务抽象实现类 AbstractSchedulerTaskSvc.java   
  13. 定时任务接口-采集器实现类-多线程版 SchedulerAcquisitionSvcImpl.java   
  14. 定时服务关联任务bean SchedulerTaskBean.java   
  15. 计划任务Controller CmsSchedulerAct.java   
  16. 持久对象基类 BaseCmsScheduler.java   
  17. 持久对象 CmsScheduler.java   
  18. HBM文件 CmsScheduler.hbm.xml   
  19. ==============================定时任务模块相关互助类====================================   
  20. 计划框架   
  21. 计划框架-任务调度 Scheduler.java   
  22. 计划框架-时间生成器接口 ScheduleIterator.java   
  23. 计划任务抽象类 SchedulerTask.java   
  24. 计划框架-时间生成器接口实现类 SimpleScheduleIterator.java   
  25. 时间计划参数bean ScheduleParamBean.java   
  26. 采集相关   
  27. HTML解析工具类接口 ParseHtmlTool.java   
  28. HTML解析工具,HtmlParser实现类 HtmlParserImpl.java   
  29. 采集参数封装bean ParamBean.java   
  30. 队列 Queue.java   
  31. URL队列 UrlQueue.java   
  32. 接下来是XML配置   
  33. ==============================定时任务模块XML配置====================================   
  34. dao配置   
  35. <bean id="cmsSchedulerDao" class="com.jeecms.cms.dao.assist.impl.CmsSchedulerDaoImpl"/>   
  36. manage配置   
  37. <bean id="cmsSchedulerMng" class="com.jeecms.cms.manager.assist.impl.CmsSchedulerMngImpl"/>   
  38. SERVICE配置   
  39. <bean id="schedulerAcquisitionSvc" class="com.jeecms.cms.service.scheduler.SchedulerAcquisitionSvcImpl"/>   
  40. <bean id="schedulerTaskManageSvc" class="com.jeecms.cms.service.scheduler.SchedulerTaskManageSvcImpl"/>   
  41. 接下来是messages_zh_CN.properties 添加了常量   
  42. ==============================messages_zh_CN.properties====================================   
  43. messages_zh_CN.properties   
  44. 接下来是模板   
  45. ==============================模板====================================   
  46. generate_left.html 有修改   
  47. scheduler/add.html   
  48. scheduler/edit.html   
  49. scheduler/list.html   

具体代码如下: 
Java代码   收藏代码
  1. ==============================SQL====================================   
  2. 1:计划任务表   
  3. /*  
  4. MySQL Data Transfer  
  5. Source Host: localhost  
  6. Source Database: jeecms  
  7. Target Host: localhost  
  8. Target Database: jeecms  
  9. Date: 2011-11-8 11:36:55  
  10. */   
  11.   
  12. SET FOREIGN_KEY_CHECKS=0;   
  13. -- ----------------------------   
  14. -- Table structure for jc_scheduler   
  15. -- ----------------------------   
  16. CREATE TABLE `jc_scheduler` (   
  17.   `scheduler_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '任务主键',   
  18.   `site_id` int(11) DEFAULT NULL,   
  19.   `associate_id` int(11) DEFAULT NULL COMMENT '相关ID',   
  20.   `module_type` varchar(100) DEFAULT NULL COMMENT '模块类型',   
  21.   `name` varchar(100) DEFAULT NULL COMMENT '任务名称',   
  22.   `start_time` datetime DEFAULT NULL COMMENT '开始时间',   
  23.   `end_time` datetime DEFAULT NULL COMMENT '结束时间',   
  24.   `status` int(1) NOT NULL DEFAULT '0' COMMENT '当前状态(0:静止;1:采集)',   
  25.   `expression` varchar(50) NOT NULL COMMENT '计划表达式',   
  26.   PRIMARY KEY (`scheduler_id`)   
  27. ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;   
  28.   
  29. -- ----------------------------   
  30. -- Records    
  31. -- ----------------------------   
  32. INSERT INTO `jc_scheduler` VALUES ('4''1''1''schedulerAcquisitionSvc''测试''2011-11-07 18:02:30''2011-11-07 18:04:00''0''*,*,*,*,3,0');   
  33. INSERT INTO `jc_scheduler` VALUES ('8''1''5''schedulerAcquisitionSvc''测试采集java''2011-11-08 10:25:15''2011-11-08 10:27:04''0''*,*,*,*,26,0');   
  34. INSERT INTO `jc_scheduler` VALUES ('9''1''1''schedulerAcquisitionSvc''测试采集新闻''2011-11-08 10:37:58''2011-11-08 10:38:11''0''*,*,*,*,38,0');   

Java代码   收藏代码
  1. ==============================定时任务模块类====================================   
  2. 计划管理DAO接口 CmsSchedulerDao.java   
  3. package com.jeecms.cms.dao.assist;   
  4.   
  5. import java.util.List;   
  6.   
  7. import com.jeecms.cms.entity.assist.CmsScheduler;   
  8. import com.jeecms.common.hibernate3.Updater;   
  9. /**  
  10.  * 计划管理DAO接口  
  11.  * @author javacoo  
  12.  * @since 2011-11-07  
  13.  */   
  14. public interface CmsSchedulerDao {   
  15. public List<CmsScheduler> getList();   
  16.   
  17. public List<CmsScheduler> getListBy(CmsScheduler bean);   
  18.   
  19. public CmsScheduler findById(Integer id);   
  20.   
  21. public CmsScheduler save(CmsScheduler bean);   
  22.   
  23. public CmsScheduler updateByUpdater(Updater<CmsScheduler> updater);   
  24.   
  25. public CmsScheduler deleteById(Integer id);   
  26. }   

Java代码   收藏代码
  1. 计划管理DAO接口实现类 CmsSchedulerDaoImpl.java   
  2. package com.jeecms.cms.dao.assist.impl;   
  3.   
  4. import java.util.List;   
  5.   
  6. import org.apache.commons.lang.StringUtils;   
  7. import org.springframework.stereotype.Repository;   
  8.   
  9. import com.jeecms.cms.dao.assist.CmsSchedulerDao;   
  10. import com.jeecms.cms.entity.assist.CmsScheduler;   
  11. import com.jeecms.common.hibernate3.Finder;   
  12. import com.jeecms.common.hibernate3.HibernateBaseDao;   
  13.   
  14. @Repository   
  15. public class CmsSchedulerDaoImpl extends   
  16. HibernateBaseDao<CmsScheduler, Integer> implements CmsSchedulerDao {   
  17. @SuppressWarnings("unchecked")   
  18. public List<CmsScheduler> getList() {   
  19. Finder f = Finder.create("from CmsScheduler bean order by bean.id asc");   
  20. return find(f);   
  21. }   
  22. @SuppressWarnings("unchecked")   
  23. public List<CmsScheduler> getListBy(CmsScheduler bean) {   
  24. Finder f = Finder.create("from CmsScheduler bean");   
  25. if(StringUtils.isNotEmpty(bean.getModuleType()) && bean.getSite().getId() != null) {   
  26. f.append(" where bean.moduleType=:moduleType and bean.site.id=:siteId");   
  27. f.setParam("moduleType", bean.getModuleType());   
  28. f.setParam("siteId", bean.getSite().getId());   
  29. }   
  30. f.append(" order by bean.id asc");   
  31. return find(f);   
  32. }   
  33.   
  34. public CmsScheduler findById(Integer id) {   
  35. CmsScheduler entity = get(id);   
  36. return entity;   
  37. }   
  38.   
  39. public CmsScheduler save(CmsScheduler bean) {   
  40. getSession().save(bean);   
  41. return bean;   
  42. }   
  43.   
  44. public CmsScheduler deleteById(Integer id) {   
  45. CmsScheduler entity = super.get(id);   
  46. if (entity != null) {   
  47. getSession().delete(entity);   
  48. }   
  49. return entity;   
  50. }   
  51.   
  52. @Override   
  53. protected Class<CmsScheduler> getEntityClass() {   
  54. return CmsScheduler.class;   
  55. }   
  56. }   

Java代码   收藏代码
  1. 计划任务管理服务接口 CmsSchedulerMng.java   
  2. package com.jeecms.cms.manager.assist;   
  3.   
  4. import java.util.List;   
  5.   
  6. import com.jeecms.cms.entity.assist.CmsScheduler;   
  7. /**  
  8.  * 计划任务管理服务接口  
  9.  * @author javacoo  
  10.  * @since 2011-11-07  
  11.  * @version 1.0   
  12.  */   
  13. public interface CmsSchedulerMng {   
  14. /**  
  15.  * 取得所有计划任务  
  16.  * @return 所有计划任务  
  17.  */   
  18. List<CmsScheduler> getList();   
  19. /**  
  20.  * 取得指定站点,指定模块所有计划任务  
  21.  * @param bean 计划任务bean  
  22.  * @return 所有计划任务  
  23.  */   
  24. List<CmsScheduler> getListBy(CmsScheduler bean);   
  25.     /**  
  26.      * 根据ID取得计划任务  
  27.      * @param id  
  28.      * @return 计划任务  
  29.      */   
  30. CmsScheduler findById(Integer id);   
  31.     /**  
  32.      * 停止指定的计划任务  
  33.      * @param id  
  34.      */   
  35. void stop(Integer id);   
  36. /**  
  37.      * 开始指定的计划任务  
  38.      * @param id  
  39.      */   
  40. CmsScheduler start(Integer id);   
  41. /**  
  42.      * 停止指定的计划任务  
  43.      * @param id  
  44.      */   
  45. void end(Integer id);   
  46.     /**  
  47.      * 保存计划任务  
  48.      * @param bean  
  49.      * @return  
  50.      */   
  51. CmsScheduler save(CmsScheduler bean);   
  52. /**  
  53.      * 更新计划任务  
  54.      * @param bean  
  55.      * @return  
  56.      */   
  57. CmsScheduler update(CmsScheduler bean);   
  58. /**  
  59.      * 删除计划任务  
  60.      * @param bean  
  61.      * @return  
  62.      */   
  63. CmsScheduler deleteById(Integer id);   
  64. /**  
  65.      * 批量删除计划任务  
  66.      * @param bean  
  67.      * @return  
  68.      */   
  69. CmsScheduler[] deleteByIds(Integer[] ids);   
  70. }   

Java代码   收藏代码
  1. 计划任务管理服务接口实现类 CmsSchedulerMngImpl.java   
  2. package com.jeecms.cms.manager.assist.impl;   
  3.   
  4. import java.util.Date;   
  5. import java.util.List;   
  6.   
  7. import org.springframework.beans.factory.annotation.Autowired;   
  8. import org.springframework.stereotype.Service;   
  9. import org.springframework.transaction.annotation.Transactional;   
  10.   
  11. import com.jeecms.cms.dao.assist.CmsSchedulerDao;   
  12. import com.jeecms.cms.entity.assist.CmsAcquisition;   
  13. import com.jeecms.cms.entity.assist.CmsScheduler;   
  14. import com.jeecms.cms.manager.assist.CmsSchedulerMng;   
  15. import com.jeecms.common.hibernate3.Updater;   
  16. /**  
  17.  * 计划任务管理服务接口实现类  
  18.  * @author javacoo  
  19.  * @since 2011-11-07  
  20.  * @version 1.0   
  21.  */   
  22. @Service   
  23. @Transactional   
  24. public class CmsSchedulerMngImpl implements CmsSchedulerMng{   
  25. @Transactional(readOnly = true)   
  26. public List<CmsScheduler> getList() {   
  27. return dao.getList();   
  28. }   
  29.   
  30. @Transactional(readOnly = true)   
  31. public List<CmsScheduler> getListBy(CmsScheduler bean) {   
  32. return dao.getListBy(bean);   
  33. }   
  34.   
  35. @Transactional(readOnly = true)   
  36. public CmsScheduler findById(Integer id) {   
  37. CmsScheduler entity = dao.findById(id);   
  38. return entity;   
  39. }   
  40.   
  41. public void stop(Integer id) {   
  42. CmsScheduler acqu = findById(id);   
  43. if (acqu == null) {   
  44. return;   
  45. }   
  46. if (acqu.getStatus() == CmsScheduler.START) {   
  47. acqu.setStatus(CmsScheduler.STOP);   
  48. }   
  49. }   
  50.   
  51.   
  52. public CmsScheduler start(Integer id) {   
  53. CmsScheduler scheduler = findById(id);   
  54. if (scheduler == null) {   
  55. return scheduler;   
  56. }   
  57. scheduler.setStatus(CmsAcquisition.START);   
  58. scheduler.setStartTime(new Date());   
  59. scheduler.setEndTime(null);   
  60. return scheduler;   
  61. }   
  62.   
  63. public void end(Integer id) {   
  64. CmsScheduler scheduler = findById(id);   
  65. if (scheduler == null) {   
  66. return;   
  67. }   
  68. scheduler.setStatus(CmsAcquisition.STOP);   
  69. scheduler.setEndTime(new Date());   
  70. }   
  71.   
  72.   
  73. public CmsScheduler save(CmsScheduler bean) {   
  74. bean.init();   
  75. dao.save(bean);   
  76. return bean;   
  77. }   
  78.   
  79. public CmsScheduler update(CmsScheduler bean) {   
  80. Updater<CmsScheduler> updater = new Updater<CmsScheduler>(bean);   
  81. bean = dao.updateByUpdater(updater);   
  82. return bean;   
  83. }   
  84.   
  85. public CmsScheduler deleteById(Integer id) {   
  86. CmsScheduler bean = dao.deleteById(id);   
  87. return bean;   
  88. }   
  89.   
  90. public CmsScheduler[] deleteByIds(Integer[] ids) {   
  91. CmsScheduler[] beans = new CmsScheduler[ids.length];   
  92. for (int i = 0, len = ids.length; i < len; i++) {   
  93. beans[i] = deleteById(ids[i]);   
  94. }   
  95. return beans;   
  96. }   
  97.   
  98. private CmsSchedulerDao dao;   
  99.   
  100.   
  101.   
  102. @Autowired   
  103. public void setDao(CmsSchedulerDao dao) {   
  104. this.dao = dao;   
  105. }   
  106.   
  107. }   

Java代码   收藏代码
  1. 定时任务管理接口 SchedulerTaskManageSvc.java   
  2. package com.jeecms.cms.service.scheduler;   
  3.   
  4. import java.util.List;   
  5.   
  6. import com.jeecms.cms.entity.assist.CmsScheduler;   
  7.   
  8.   
  9. /**  
  10.  * 定时任务管理接口  
  11.  * @author javacoo  
  12.  * @since 2011-11-07  
  13.  */   
  14. public interface SchedulerTaskManageSvc {   
  15. /**  
  16.  * 开始计划任务  
  17.  * @param scheduler 任务对象  
  18.  * @return true/false  
  19.  */   
  20. boolean start(CmsScheduler scheduler);   
  21. /**  
  22.  * 结束计划任务  
  23.  * @param scheduler 任务对象  
  24.  * @return true/false  
  25.  */   
  26. boolean stop(CmsScheduler scheduler);   
  27. /**  
  28.  * 取得关联任务map  
  29.  * @param scheduler 任务对象  
  30.  * @return 关联任务map  
  31.  */   
  32. List<SchedulerTaskBean> associateTaskList(CmsScheduler scheduler);   
  33. }   

Java代码   收藏代码
  1. 定时任务管理接口实现类 SchedulerTaskManageSvcImpl.java   
  2. package com.jeecms.cms.service.scheduler;   
  3.   
  4. import java.util.List;   
  5. import java.util.Map;   
  6. import java.util.concurrent.ConcurrentHashMap;   
  7.   
  8. import org.apache.commons.lang.StringUtils;   
  9. import org.springframework.beans.factory.annotation.Autowired;   
  10. import org.springframework.stereotype.Service;   
  11.   
  12. import com.jeecms.cms.entity.assist.CmsScheduler;   
  13. import com.jeecms.common.scheduling.core.Scheduler;   
  14. import com.jeecms.common.scheduling.core.SchedulerTask;   
  15. import com.jeecms.common.scheduling.impl.ScheduleParamBean;   
  16. import com.jeecms.common.scheduling.impl.SimpleScheduleIterator;   
  17. /**  
  18.  * 定时任务管理服务接口实现类  
  19.  * @author javacoo  
  20.  * @since 2011-11-07  
  21.  */   
  22. @Service   
  23. public class SchedulerTaskManageSvcImpl implements SchedulerTaskManageSvc {  
  24. /**任务管理对象MAP*/   
  25. private static Map<Integer,TaskManage> taskManageMap = new ConcurrentHashMap<Integer, TaskManage>();   
  26. /**定时任务服务对象MAP*/   
  27. @Autowired   
  28. private Map<String,SchedulerTaskSvc> schedulerTaskSvcMap;   
  29.     /**  
  30.      * 任务管理对象  
  31.      * @author javacoo  
  32.      * @since 2011-11-07  
  33.      */   
  34.     private class TaskManage{   
  35.         /**任务调度*/   
  36.         private final Scheduler scheduler = new Scheduler();   
  37.         /**任务参数bean*/   
  38.         private ScheduleParamBean scheduleParamBean;   
  39.         /**定时任务*/   
  40.         private final SchedulerTaskSvc schedulerTaskSvc;   
  41.         private CmsScheduler cmsScheduler;   
  42.         public TaskManage(SchedulerTaskSvc schedulerSvc,CmsScheduler cmsScheduler){   
  43.          this.schedulerTaskSvc = schedulerSvc;   
  44.          this.cmsScheduler = cmsScheduler;   
  45.         }   
  46.         /**  
  47.          * 解析计划表达式  
  48.          * @return  
  49.          */   
  50.         private boolean parseSchedulerParam(){   
  51.          scheduleParamBean = new ScheduleParamBean();   
  52.          System.out.println("计划表达式:"+cmsScheduler.getExpression());   
  53.          String schedulerParamStr = cmsScheduler.getExpression();   
  54.          if(StringUtils.isNotEmpty(schedulerParamStr) && schedulerParamStr.contains(",")){   
  55.          String[] strAarr = schedulerParamStr.split(",");   
  56.          if(strAarr.length == 6){   
  57.          if(StringUtils.isNumeric(strAarr[0])){   
  58.          scheduleParamBean.setWeekOfMonth(Integer.valueOf(strAarr[0]));   
  59.          }   
  60.          if(StringUtils.isNumeric(strAarr[1])){   
  61.          scheduleParamBean.setDayOfWeek(Integer.valueOf(strAarr[1]));   
  62.          }   
  63.          if(StringUtils.isNumeric(strAarr[2])){   
  64.          scheduleParamBean.setDayOfMonth(Integer.valueOf(strAarr[2]));   
  65.          }   
  66.          if(StringUtils.isNumeric(strAarr[3])){   
  67.          scheduleParamBean.setHourOfDay(Integer.valueOf(strAarr[3]));   
  68.          }   
  69.          if(StringUtils.isNumeric(strAarr[4])){   
  70.          scheduleParamBean.setMinute(Integer.valueOf(strAarr[4]));   
  71.          }   
  72.          if(StringUtils.isNumeric(strAarr[5])){   
  73.          scheduleParamBean.setSecond(Integer.valueOf(strAarr[5]));   
  74.          }   
  75.          }else{   
  76.          return false;   
  77.          }   
  78.          }else{   
  79.          return false;   
  80.          }   
  81.          return true;   
  82.         }   
  83.         /**  
  84.          * 开始  
  85.          */   
  86.         public void start() {   
  87.          if(parseSchedulerParam()){   
  88.          scheduler.schedule(new SchedulerTask() {   
  89.          public void run() {   
  90.          processer();   
  91.          }   
  92.          private void processer() {   
  93.          System.out.println("============开始执行计划任务=================");   
  94.          schedulerTaskSvc.start(cmsScheduler);   
  95.          }   
  96.          }, new SimpleScheduleIterator(scheduleParamBean));   
  97.          }   
  98.         }   
  99.         /**  
  100.          * 取消  
  101.          */   
  102.         public void cancel() {   
  103.          schedulerTaskSvc.stop(cmsScheduler);   
  104.          scheduler.cancel();   
  105.         }   
  106.           
  107.     }   
  108.     /**  
  109.      * 开始执行计划  
  110.      * @param scheduler 计划对象  
  111.      */   
  112. public boolean start(CmsScheduler scheduler) {   
  113. SchedulerTaskSvc schedulerSvc = getSchedulerTaskSvcByModuleType(scheduler.getModuleType());   
  114. TaskManage taskManage = new TaskManage(schedulerSvc,scheduler);   
  115. taskManage.start();   
  116. taskManageMap.put(scheduler.getId(), taskManage);   
  117. return true;   
  118. }   
  119. /**  
  120.      * 停止执行计划  
  121.      * @param scheduler 计划对象  
  122.      */   
  123. public boolean stop(CmsScheduler scheduler) {   
  124. TaskManage taskManage = taskManageMap.get(scheduler.getId());   
  125. taskManage.cancel();   
  126. return true;   
  127. }   
  128. /**  
  129.      * 取得计划关联的任务对象集合  
  130.      * @param scheduler 计划对象  
  131.      */   
  132. public List<SchedulerTaskBean> associateTaskList(CmsScheduler scheduler) {   
  133. SchedulerTaskSvc schedulerSvc = getSchedulerTaskSvcByModuleType(scheduler.getModuleType());   
  134. return schedulerSvc.associateTaskList(scheduler);   
  135. }   
  136.   
  137. /**  
  138.      * 根据模块的类型,取得定时任务服务对象  
  139.      * @param moduleType 模块类型  
  140.      */   
  141. private SchedulerTaskSvc getSchedulerTaskSvcByModuleType(String moduleType){   
  142. return schedulerTaskSvcMap.get(moduleType);   
  143. }   
  144.   
  145. }   

Java代码   收藏代码
  1. 定时任务接口 SchedulerTaskSvc.java   
  2. package com.jeecms.cms.service.scheduler;   
  3.   
  4. import java.util.List;   
  5.   
  6. import com.jeecms.cms.entity.assist.CmsScheduler;   
  7.   
  8. /**  
  9.  * 定时任务接口  
  10.  * @author javacoo  
  11.  * @since 2011-11-04  
  12.  */   
  13. public interface SchedulerTaskSvc {   
  14. /**  
  15.  * 开始计划任务  
  16.  * @param cmsScheduler 任务对象  
  17.  * @return true/false  
  18.  */   
  19. boolean start(CmsScheduler cmsScheduler);   
  20. /**  
  21.  * 结束计划任务  
  22.  * @param cmsScheduler 任务对象  
  23.  * @return true/false  
  24.  */   
  25. boolean stop(CmsScheduler cmsScheduler);   
  26. /**  
  27.  * 取得关联任务map  
  28.  * @param cmsScheduler 任务对象  
  29.  * @return 关联任务map  
  30.  */   
  31. List<SchedulerTaskBean> associateTaskList(CmsScheduler cmsScheduler);   
  32. }   

Java代码   收藏代码
  1. 定时任务抽象实现类 AbstractSchedulerTaskSvc.java   
  2. package com.jeecms.cms.service.scheduler;   
  3.   
  4. import java.util.List;   
  5.   
  6. import com.jeecms.cms.entity.assist.CmsScheduler;   
  7. /**  
  8.  * 定时任务抽象实现类  
  9.  * @author javacoo  
  10.  * @since 2011-11-08  
  11.  */   
  12. public abstract class AbstractSchedulerTaskSvc implements SchedulerTaskSvc{   
  13.   
  14. /**  
  15.  * 开始计划任务  
  16.  * @return true/false  
  17.  */   
  18. public boolean start(CmsScheduler scheduler){   
  19. return execute(scheduler);   
  20. }   
  21. /**  
  22.  * 开始计划任务  
  23.  * @return true/false  
  24.  */   
  25. public boolean stop(CmsScheduler scheduler){   
  26. return true;   
  27. }   
  28. /**  
  29.  * 取得关联任务map  
  30.  * @return 关联任务map  
  31.  */   
  32. public List<SchedulerTaskBean> associateTaskList(CmsScheduler scheduler){   
  33. return null;   
  34. }   
  35. protected abstract boolean execute(CmsScheduler scheduler);   
  36.   
  37. }   

Java代码   收藏代码
  1. 定时任务接口-采集器实现类-多线程版 SchedulerAcquisitionSvcImpl.java   
  2. package com.jeecms.cms.service.scheduler;   
  3.   
  4. import java.io.IOException;   
  5. import java.net.URI;   
  6. import java.net.URISyntaxException;   
  7. import java.util.ArrayList;   
  8. import java.util.HashMap;   
  9. import java.util.List;   
  10. import java.util.Map;   
  11. import java.util.concurrent.CountDownLatch;   
  12. import java.util.concurrent.ExecutorService;   
  13. import java.util.concurrent.Executors;   
  14.   
  15. import org.apache.commons.lang.StringUtils;   
  16. import org.apache.http.HttpEntity;   
  17. import org.apache.http.HttpHost;   
  18. import org.apache.http.HttpResponse;   
  19. import org.apache.http.StatusLine;   
  20. import org.apache.http.client.ClientProtocolException;   
  21. import org.apache.http.client.HttpClient;   
  22. import org.apache.http.client.HttpResponseException;   
  23. import org.apache.http.client.ResponseHandler;   
  24. import org.apache.http.client.methods.HttpGet;   
  25. import org.apache.http.conn.params.ConnRoutePNames;   
  26. import org.apache.http.impl.client.DefaultHttpClient;   
  27. import org.apache.http.util.EntityUtils;   
  28. import org.slf4j.Logger;   
  29. import org.slf4j.LoggerFactory;   
  30. import org.springframework.beans.factory.annotation.Autowired;   
  31. import org.springframework.stereotype.Service;   
  32.   
  33. import com.jeecms.cms.entity.assist.CmsAcquisition;   
  34. import com.jeecms.cms.entity.main.Content;   
  35. import com.jeecms.cms.manager.assist.CmsAcquisitionMng;   
  36. import com.jeecms.common.crawler.UrlQueue;   
  37. import com.jeecms.common.crawler.util.HtmlParserImpl;   
  38. import com.jeecms.common.crawler.util.ParseHtmlTool;   
  39. /**  
  40.  * 计划任务接口-采集器实现类-多线程版  
  41.  * @author javacoo  
  42.  * @since 2011-11-02  
  43.  * @version 1.0   
  44.  */   
  45. @Service   
  46. public class SchedulerAcquisitionSvcImpl extends AbstractSchedulerTaskSvc {   
  47. private Logger log = LoggerFactory.getLogger(SchedulerAcquisitionSvcImpl.class);   
  48. /**开启线程数*/   
  49. private static int THREAD_NUM = 2;   
  50. /**每个线程休眠毫秒数*/   
  51. private static int SLEEP_TIME = 100;   
  52. /**连接集合标志*/   
  53.     private static String LINK_KEY = "linkKey";   
  54.     /**标题集合标志*/   
  55. private static String TITLE_KEY = "titleKey";   
  56. /**采集管理对象*/   
  57. private CmsAcquisitionMng cmsAcquisitionMng;   
  58. /**存放HttpClient的ThreadLocal对象*/   
  59. private static ThreadLocal<HttpClient> httpClientThreadLocal = new ThreadLocal<HttpClient>();   
  60. /**存放ParseHtmlTool的ThreadLocal对象*/   
  61. private static ThreadLocal<ParseHtmlTool> parseHtmlToolThreadLocal = new ThreadLocal<ParseHtmlTool>();   
  62. /**存放UrlQueue的ThreadLocal对象*/   
  63. private static ThreadLocal<UrlQueue> urlQueueThreadLocal = new ThreadLocal<UrlQueue>();   
  64. /**存放计划UrlQueue的ThreadLocal对象*/   
  65. private static ThreadLocal<UrlQueue> planUrlQueueThreadLocal = new ThreadLocal<UrlQueue>();   
  66.   
  67. @Autowired   
  68. public void setCmsAcquisitionMng(CmsAcquisitionMng cmsAcquisitionMng) {   
  69. this.cmsAcquisitionMng = cmsAcquisitionMng;   
  70. }   
  71. @Override   
  72. protected boolean execute(CmsScheduler scheduler) {   
  73. CmsAcquisition acqu = cmsAcquisitionMng.findById(scheduler.getAssociateId());   
  74. if (acqu == null) {   
  75. return false;   
  76. }   
  77. System.out.println("===============开始执行采集任务");   
  78. new Thread(new MainThreadProcesser(this,acqu)).start();   
  79. return true;   
  80. }   
  81.  /**  
  82.  * 取得关联任务map  
  83.  * @return 关联任务map  
  84.  */   
  85. public List<SchedulerTaskBean> associateTaskList(CmsScheduler scheduler){   
  86. List<CmsAcquisition> list = cmsAcquisitionMng.getList(scheduler.getSite().getId());   
  87. List<SchedulerTaskBean> resultList = new ArrayList<SchedulerTaskBean>();   
  88. SchedulerTaskBean schedulerTaskBean = null;   
  89. for(CmsAcquisition acquisition : list){   
  90. schedulerTaskBean = new SchedulerTaskBean();   
  91. schedulerTaskBean.setId(acquisition.getId());   
  92. schedulerTaskBean.setName(acquisition.getName());   
  93. resultList.add(schedulerTaskBean);   
  94. }   
  95. return resultList;   
  96. }   
  97.   
  98. /**  
  99.  * 主线程处理类  
  100.  * @author javacoo  
  101.  * @since 2011-11-02  
  102.  */   
  103. private class MainThreadProcesser implements Runnable {   
  104. private CmsAcquisition acqu;   
  105. private SchedulerTaskSvc schedulerAcquisitionSvc;   
  106. public MainThreadProcesser(SchedulerTaskSvc schedulerAcquisitionSvc,CmsAcquisition acqu) {   
  107. this.acqu = acqu;   
  108. this.schedulerAcquisitionSvc = schedulerAcquisitionSvc;   
  109. }   
  110. //线程锁   
  111. Object threadLock = new Object();    
  112. public void run() {   
  113. long tStart = System.currentTimeMillis();   
  114. System.out.println("主线程:"+Thread.currentThread().getName() + "开始...");   
  115. try {   
  116. CountDownLatch latch = new CountDownLatch(THREAD_NUM);   
  117. ExecutorService exec = Executors.newCachedThreadPool();   
  118. getHttpClient().getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,new HttpHost("128.160.64.5"1235));   
  119. CharsetHandler handler = new CharsetHandler(acqu.getPageEncoding());    
  120. //取得当前任务所有计划   
  121. getAllPlans(acqu,getPlanUrlQueue());   
  122. //开启一线程执行抓取计划下URL   
  123. Thread thread = new Thread(new FetchUrlThread(schedulerAcquisitionSvc,latch,getHttpClient(),getPlanUrlQueue(),getUrlQueue(),getParseHtmlTool(acqu),handler,threadLock));   
  124. exec.execute(thread);   
  125. //开启指定数目线程执行采集内容   
  126. for(int i=0;i<THREAD_NUM;i++){   
  127. thread = new Thread(new FetchContentThread(schedulerAcquisitionSvc,acqu,latch,getHttpClient(),getUrlQueue(),getParseHtmlTool(acqu),handler,threadLock));   
  128. exec.execute(thread);   
  129. }   
  130. latch.await();   
  131. exec.shutdown();   
  132. catch (InterruptedException e) {   
  133. e.printStackTrace();   
  134. finally{   
  135. httpClientThreadLocal.get().getConnectionManager().shutdown();   
  136.   
  137. httpClientThreadLocal.remove();   
  138. parseHtmlToolThreadLocal.remove();   
  139. urlQueueThreadLocal.remove();   
  140. planUrlQueueThreadLocal.remove();   
  141.   
  142. long tEnd = System.currentTimeMillis();   
  143. System.out.println("主线程:"+Thread.currentThread().getName() + "结束...");   
  144. System.out.println("主线程:"+Thread.currentThread().getName() + "总共用时:" + (tEnd - tStart) + "ms");   
  145. }   
  146. }   
  147. }   
  148. /**  
  149.  * 采集URL线程  
  150.  * @author javacoo  
  151.  * @since 2011-11-04  
  152.  */   
  153. private class FetchUrlThread implements Runnable{   
  154. private SchedulerTaskSvc acquisitionSvc;   
  155. private CountDownLatch latch;   
  156. private UrlQueue urlQueue;   
  157. private UrlQueue planUrlQueue;   
  158. private HttpClient httpClient;   
  159. private ParseHtmlTool parseHtmlTool;   
  160. private CharsetHandler handler;   
  161. private Object threadLock;   
  162. public FetchUrlThread(SchedulerTaskSvc acquisitionSvc,CountDownLatch latch,HttpClient httpClient,UrlQueue planUrlQueue,UrlQueue urlQueue,ParseHtmlTool parseHtmlTool,CharsetHandler handler,Object threadLock){   
  163. this.acquisitionSvc = acquisitionSvc;   
  164. this.latch = latch;   
  165. this.urlQueue = urlQueue;   
  166. this.planUrlQueue = planUrlQueue;   
  167. this.httpClient = httpClient;   
  168. this.parseHtmlTool = parseHtmlTool;   
  169. this.handler = handler;   
  170. this.threadLock = threadLock;   
  171. }   
  172. public void run() {   
  173. System.out.println("======================采集URL子线程:"+Thread.currentThread().getName() + "开始...");   
  174. try {   
  175. Map<String,String> urlMap = null;   
  176. while(!urlAndTitleMapIsEmpty(planUrlQueue)) {   
  177. urlMap = getUrlAndTitleMap(planUrlQueue);   
  178. getAllUrls(httpClient,parseHtmlTool,handler,urlQueue,urlMap);   
  179. Thread.sleep(SLEEP_TIME);   
  180. }   
  181. catch (ClientProtocolException e) {   
  182. e.printStackTrace();   
  183. catch (URISyntaxException e) {   
  184. e.printStackTrace();   
  185. catch (IOException e) {   
  186. e.printStackTrace();   
  187. catch (InterruptedException e) {   
  188. // TODO Auto-generated catch block   
  189. e.printStackTrace();   
  190. }finally {   
  191. System.out.println("======================采集URL子线程:"+Thread.currentThread().getName() + "结束.");   
  192. //通知采集内容线程开始执行   
  193. synchronized(threadLock) {    
  194. threadLock.notifyAll();   
  195. }   
  196. latch.countDown();   
  197.   
  198. }   
  199. }   
  200. }   
  201.   
  202. /**  
  203.  * 采集内容线程  
  204.  * @author javacoo  
  205.  * @since 2011-11-02  
  206.  */   
  207. private class FetchContentThread implements Runnable {   
  208. private SchedulerTaskSvc acquisitionSvc;   
  209. private CmsAcquisition acqu;   
  210. private CountDownLatch latch;   
  211. private UrlQueue urlQueue;   
  212. private HttpClient httpClient;   
  213. private ParseHtmlTool parseHtmlTool;   
  214. private CharsetHandler handler;   
  215. private Object threadLock;   
  216. public FetchContentThread(SchedulerTaskSvc acquisitionSvc,CmsAcquisition acqu,CountDownLatch latch,HttpClient httpClient,UrlQueue urlQueue,ParseHtmlTool parseHtmlTool,CharsetHandler handler,Object threadLock) {   
  217. this.acquisitionSvc = acquisitionSvc;   
  218. this.acqu = acqu;   
  219. this.latch = latch;   
  220. this.urlQueue = urlQueue;   
  221. this.httpClient = httpClient;   
  222. this.parseHtmlTool = parseHtmlTool;   
  223. this.handler = handler;   
  224. this.threadLock = threadLock;   
  225. }   
  226. public void run() {   
  227. System.out.println("======================采集内容子线程:"+Thread.currentThread().getName() + "开始...");   
  228. try {   
  229. //等待采集URL线程执行完毕   
  230. synchronized(threadLock) {    
  231. threadLock.wait();   
  232. }   
  233. Map<String,String> urlMap = null;   
  234. while(!urlAndTitleMapIsEmpty(urlQueue)) {   
  235. urlMap = getUrlAndTitleMap(urlQueue);   
  236. saveContent(acqu,httpClient,parseHtmlTool,handler,urlMap);   
  237. Thread.sleep(SLEEP_TIME);   
  238. }   
  239. catch (Exception e) {   
  240. e.printStackTrace();   
  241. log.warn(null, e);   
  242. finally {   
  243. System.out.println("======================采集内容子线程:"+Thread.currentThread().getName() + "结束.");   
  244. log.info("Acquisition#{} complete", acqu.getId());   
  245. latch.countDown();   
  246. }   
  247. }   
  248. }   
  249.   
  250.   
  251. /**  
  252.  * 取得当前主线程的HttpClient对象  
  253.  * @return 当前主线程的HttpClient对象  
  254.  */   
  255. private static HttpClient getHttpClient(){   
  256. if(httpClientThreadLocal.get() == null){   
  257. HttpClient client = new DefaultHttpClient();   
  258. httpClientThreadLocal.set(client);   
  259. return client;   
  260. }else{   
  261. return httpClientThreadLocal.get();   
  262. }   
  263. }   
  264. /**  
  265.  * 取得当前主线程的UrlQueue对象  
  266.  * @return 当前主线程的UrlQueue对象  
  267.  */   
  268. private static UrlQueue getUrlQueue(){   
  269. if(urlQueueThreadLocal.get() == null){   
  270. UrlQueue urlQueue = new UrlQueue();   
  271. urlQueueThreadLocal.set(urlQueue);   
  272. return urlQueue;   
  273. }else{   
  274. return urlQueueThreadLocal.get();   
  275. }   
  276. }   
  277. /**  
  278.  * 取得当前主线程的计划UrlQueue对象  
  279.  * @return 当前主线程的计划UrlQueue对象  
  280.  */   
  281. private static UrlQueue getPlanUrlQueue(){   
  282. if(planUrlQueueThreadLocal.get() == null){   
  283. UrlQueue urlQueue = new UrlQueue();   
  284. planUrlQueueThreadLocal.set(urlQueue);   
  285. return urlQueue;   
  286. }else{   
  287. return planUrlQueueThreadLocal.get();   
  288. }   
  289. }   
  290. /**  
  291.  * 取得当前主线程的ParseHtmlTool对象  
  292.  * @param acqu 采集参数对象  
  293.  * @return 当前主线程的ParseHtmlTool对象  
  294.  */   
  295. private static ParseHtmlTool getParseHtmlTool(CmsAcquisition acqu){   
  296. if(parseHtmlToolThreadLocal.get() == null){   
  297. ParseHtmlTool parseHtmlTool = new HtmlParserImpl(acqu);   
  298. parseHtmlToolThreadLocal.set(parseHtmlTool);   
  299. return parseHtmlTool;   
  300. }else{   
  301. return parseHtmlToolThreadLocal.get();   
  302. }   
  303. }   
  304. /**  
  305.  * 连接和标题map对象入队列  
  306.  * @param map 连接和标题map对象  
  307.  */   
  308. private synchronized void addUrlAndTitleMap(Map<String,String> map,UrlQueue urlQueue){   
  309. System.out.println("====线程:"+Thread.currentThread().getName() + ",添加  urlQueue:"+urlQueue);   
  310. urlQueue.addUnVisitedUrl(map);   
  311. }   
  312. /**  
  313.  * 连接和标题map对象出队列  
  314.  * @param urlQueue 当前线程的队列  
  315.  * @return 连接和标题map对象  
  316.  */   
  317. private synchronized Map<String,String> getUrlAndTitleMap(UrlQueue urlQueue){   
  318. System.out.println("====线程:"+Thread.currentThread().getName() + ",取得 urlQueue:"+urlQueue);   
  319. return urlQueue.unVisitedUrlDeQueue();   
  320. }   
  321. /**  
  322.  *  判断当前对象是否为空  
  323.  * @param urlQueue 当前线程的队列  
  324.  * @return true/flase  
  325.  */   
  326. private synchronized boolean urlAndTitleMapIsEmpty(UrlQueue urlQueue){   
  327. System.out.println("====线程:"+Thread.currentThread().getName() + ",判断 urlQueue:"+urlQueue);   
  328. return urlQueue.isEmpty();   
  329. }   
  330. /**  
  331.  * 取得当前线程下所有计划,并加入队列  
  332.  * @param acqu 采集参数对象  
  333.  * @param urlQueue 队列  
  334.  * @throws URISyntaxException   
  335.  * @throws IOException   
  336.  * @throws ClientProtocolException   
  337.  */   
  338. private void getAllPlans(CmsAcquisition acqu,UrlQueue urlQueue){   
  339. String[] plans = acqu.getAllPlans();   
  340. Map<String,String> planMap = new HashMap<String,String>();   
  341. for (int i = plans.length - 1; i >= 0; i--) {   
  342. planMap.put(LINK_KEY, plans[i]);   
  343. planMap.put(TITLE_KEY, acqu.getName());   
  344. addUrlAndTitleMap(planMap,urlQueue);   
  345. }   
  346. System.out.println("=======当前线程:"+Thread.currentThread().getName() + "计划URL连接数:"+urlQueue.getUnVisitedUrlNum());   
  347. }   
  348. /**  
  349.  * 取得当前线程下所有计划的连接,并加入队列  
  350.  * @param acqu 采集参数对象  
  351.  * @param handler 字符集对象  
  352.  * @param urlQueue 队列  
  353.  * @throws URISyntaxException   
  354.  * @throws IOException   
  355.  * @throws ClientProtocolException   
  356.  */   
  357. private void getAllUrls(HttpClient httpClient,ParseHtmlTool parseHtmlTool,CharsetHandler handler,UrlQueue urlQueue,Map<String,String> map) throws URISyntaxException, ClientProtocolException, IOException{   
  358. HttpGet httpGet = new HttpGet(new URI(map.get(LINK_KEY).trim()));   
  359. String html = httpClient.execute(httpGet, handler);   
  360. for(Map<String,String> planMap : parseHtmlTool.getUrlAndTitleMap(html)){   
  361. addUrlAndTitleMap(planMap,urlQueue);   
  362. }   
  363.     System.out.println("=======当前线程:"+Thread.currentThread().getName() + "URL连接数:"+urlQueue.getUnVisitedUrlNum());   
  364.  }   
  365. /**  
  366.  * 保存内容  
  367.  * @param acqu 请求参数对象  
  368.  * @param httpClient httpClient对象  
  369.  * @param parseHtmlTool parseHtmlTool对象  
  370.  * @param handler CharsetHandler对象  
  371.  * @param map 连接和标题map对象  
  372.  * @return Content  
  373.  */   
  374. private synchronized Content saveContent(CmsAcquisition acqu,HttpClient httpClient,ParseHtmlTool parseHtmlTool,CharsetHandler handler,Map<String,String> map) {  
  375. try {   
  376. HttpGet httpGet = null;   
  377. if(map.get(LINK_KEY).contains("http://")){   
  378. httpGet = new HttpGet(new URI(map.get(LINK_KEY).trim()));   
  379. }else{   
  380. httpGet = new HttpGet(new URI("http://localhost/v7/"+map.get(LINK_KEY).trim()));   
  381. }   
  382. String html = httpClient.execute(httpGet, handler);   
  383. System.out.println("=============================子线程:"+Thread.currentThread().getName() + "执行");   
  384. String txt = parseHtmlTool.getHtml(html);   
  385. //return cmsAcquisitionMng.saveContent(map.get(TITLE_KEY), txt,acqu.getId());   
  386.             return null;   
  387. catch (Exception e) {   
  388. log.warn(null, e);   
  389. e.printStackTrace();   
  390. return null;   
  391. }   
  392. }   
  393. /**  
  394.  * 字符集帮助类  
  395.  * @author Administrator  
  396.  *  
  397.  */   
  398. private class CharsetHandler implements ResponseHandler<String> {   
  399. private String charset;   
  400.   
  401. public CharsetHandler(String charset) {   
  402. this.charset = charset;   
  403. }   
  404.   
  405. public String handleResponse(HttpResponse response)   
  406. throws ClientProtocolException, IOException {   
  407. StatusLine statusLine = response.getStatusLine();   
  408. if (statusLine.getStatusCode() >= 300) {   
  409. throw new HttpResponseException(statusLine.getStatusCode(),   
  410. statusLine.getReasonPhrase());   
  411. }   
  412. HttpEntity entity = response.getEntity();   
  413. if (entity != null) {   
  414. if (!StringUtils.isBlank(charset)) {   
  415. return EntityUtils.toString(entity, charset);   
  416. else {   
  417. return EntityUtils.toString(entity);   
  418. }   
  419. else {   
  420. return null;   
  421. }   
  422. }   
  423. }   
  424.   
  425.   
  426.   
  427.   
  428.   
  429. }   

Java代码   收藏代码
  1. 定时服务关联任务bean SchedulerTaskBean.java   
  2. package com.jeecms.cms.service.scheduler;   
  3. /**  
  4.  * 定时服务关联任务bean  
  5.  * @author javacoo  
  6.  * @since 2011-11-07  
  7.  */   
  8. public class SchedulerTaskBean {   
  9. /**任务主键*/   
  10. private Integer id;   
  11. /**任务名称*/   
  12. private String name;   
  13. public Integer getId() {   
  14. return id;   
  15. }   
  16. public void setId(Integer id) {   
  17. this.id = id;   
  18. }   
  19. public String getName() {   
  20. return name;   
  21. }   
  22. public void setName(String name) {   
  23. this.name = name;   
  24. }   
  25.   
  26.   
  27.   
  28. }   

Java代码   收藏代码
  1. 计划任务Controller CmsSchedulerAct.java   
  2. package com.jeecms.cms.action.admin.assist;   
  3.   
  4. import java.util.List;   
  5.   
  6. import javax.servlet.http.HttpServletRequest;   
  7. import javax.servlet.http.HttpServletResponse;   
  8.   
  9. import org.slf4j.Logger;   
  10. import org.slf4j.LoggerFactory;   
  11. import org.springframework.beans.factory.annotation.Autowired;   
  12. import org.springframework.stereotype.Controller;   
  13. import org.springframework.ui.ModelMap;   
  14. import org.springframework.web.bind.annotation.RequestMapping;   
  15.   
  16. import com.jeecms.cms.entity.assist.CmsAcquisition;   
  17. import com.jeecms.cms.entity.assist.CmsScheduler;   
  18. import com.jeecms.cms.entity.main.CmsSite;   
  19. import com.jeecms.cms.manager.assist.CmsSchedulerMng;   
  20. import com.jeecms.cms.manager.main.CmsLogMng;   
  21. import com.jeecms.cms.service.scheduler.SchedulerTaskManageSvc;   
  22. import com.jeecms.cms.service.scheduler.SchedulerTaskBean;   
  23. import com.jeecms.cms.web.CmsUtils;   
  24. import com.jeecms.cms.web.WebErrors;   
  25. /**  
  26.  * 计划任务Controller  
  27.  * @author javacoo  
  28.  * @since 2011-11-7  
  29.  */   
  30. @Controller   
  31. public class CmsSchedulerAct {   
  32. private static final Logger log = LoggerFactory   
  33. .getLogger(CmsSchedulerAct.class);   
  34. /**日志服务*/   
  35. @Autowired   
  36. private CmsLogMng cmsLogMng;   
  37. /**计划管理服务*/   
  38. @Autowired   
  39. private CmsSchedulerMng manager;   
  40. /**计划任务管理服务*/   
  41. @Autowired   
  42. private SchedulerTaskManageSvc schedulerTaskManageSvc;   
  43.   
  44. @RequestMapping("/scheduler/v_list.do")   
  45. public String list(HttpServletRequest request, ModelMap model) {   
  46. List<CmsScheduler> list = manager.getList();   
  47. model.addAttribute("list", list);   
  48. return "scheduler/list";   
  49. }   
  50. @RequestMapping("/scheduler/v_listBy.do")   
  51. public String listBy(String moduleType,HttpServletRequest request, ModelMap model) {   
  52. CmsSite site = CmsUtils.getSite(request);   
  53. CmsScheduler scheduler = new CmsScheduler();   
  54. scheduler.setModuleType(moduleType);   
  55. scheduler.setSite(site);   
  56. List<CmsScheduler> list = manager.getListBy(scheduler);   
  57. model.addAttribute("list", list);   
  58. model.addAttribute("moduleType", moduleType);   
  59. return "scheduler/list";   
  60. }   
  61.   
  62. @RequestMapping("/scheduler/v_add.do")   
  63. public String add(String moduleType,HttpServletRequest request, ModelMap model) {   
  64. CmsSite site = CmsUtils.getSite(request);   
  65. CmsScheduler scheduler = new CmsScheduler();   
  66. scheduler.setModuleType(moduleType);   
  67. scheduler.setSite(site);   
  68. List<SchedulerTaskBean> schedulerTaskList = schedulerTaskManageSvc.associateTaskList(scheduler);   
  69. model.addAttribute("schedulerTaskList", schedulerTaskList);   
  70. model.addAttribute("moduleType", moduleType);   
  71. return "scheduler/add";   
  72. }   
  73.   
  74. @RequestMapping("/scheduler/v_edit.do")   
  75. public String edit(Integer id, HttpServletRequest request, ModelMap model) {   
  76. WebErrors errors = validateEdit(id, request);   
  77. if (errors.hasErrors()) {   
  78. return errors.showErrorPage(model);   
  79. }   
  80. CmsSite site = CmsUtils.getSite(request);   
  81. CmsScheduler scheduler = manager.findById(id);   
  82. scheduler.setSite(site);   
  83. List<SchedulerTaskBean> schedulerTaskList = schedulerTaskManageSvc.associateTaskList(scheduler);   
  84. model.addAttribute("schedulerTaskList", schedulerTaskList);   
  85. model.addAttribute("cmsScheduler", scheduler);   
  86. return "scheduler/edit";   
  87. }   
  88.   
  89. @RequestMapping("/scheduler/o_save.do")   
  90. public String save(CmsScheduler bean,HttpServletRequest request, ModelMap model) {   
  91. CmsSite site = CmsUtils.getSite(request);   
  92. bean.setSite(site);   
  93. bean = manager.save(bean);   
  94. model.addAttribute("moduleType", bean.getModuleType());   
  95. log.info("save CmsScheduler id={}", bean.getId());   
  96. cmsLogMng.operating(request, "cmsAcquisition.log.save""id="   
  97. + bean.getId() + ";name=" + bean.getName());   
  98. return "redirect:v_listBy.do";   
  99. }   
  100.   
  101. @RequestMapping("/scheduler/o_update.do")   
  102. public String update(CmsScheduler bean, HttpServletRequest request, ModelMap model) {   
  103. WebErrors errors = validateUpdate(bean.getId(), request);   
  104. if (errors.hasErrors()) {   
  105. return errors.showErrorPage(model);   
  106. }   
  107. bean = manager.update(bean);   
  108. log.info("update CmsAcquisition id={}.", bean.getId());   
  109. cmsLogMng.operating(request, "cmsAcquisition.log.update""id="   
  110. + bean.getId() + ";name=" + bean.getName());   
  111. return listBy(bean.getModuleType(),request, model);   
  112. }   
  113.   
  114. @RequestMapping("/scheduler/o_delete.do")   
  115. public String delete(String moduleType,Integer[] ids, HttpServletRequest request,   
  116. ModelMap model) {   
  117. WebErrors errors = validateDelete(ids, request);   
  118. if (errors.hasErrors()) {   
  119. return errors.showErrorPage(model);   
  120. }   
  121. CmsScheduler[] beans = manager.deleteByIds(ids);   
  122. for (CmsScheduler bean : beans) {   
  123. log.info("delete CmsAcquisition id={}", bean.getId());   
  124. cmsLogMng.operating(request, "cmsScheduler.log.delete""id="   
  125. + bean.getId() + ";name=" + bean.getName());   
  126. }   
  127. return listBy(moduleType,request, model);   
  128. }   
  129.   
  130. @RequestMapping("/scheduler/o_start.do")   
  131. public String start(Integer id, HttpServletRequest request,   
  132. HttpServletResponse response, ModelMap model) {   
  133. CmsScheduler scheduler = manager.findById(id);   
  134. schedulerTaskManageSvc.start(scheduler);   
  135. manager.start(id);   
  136. model.addAttribute("moduleType", scheduler.getModuleType());   
  137. log.info("start CmsAcquisition id={}", id);   
  138. return "redirect:v_listBy.do";   
  139. }   
  140.   
  141. @RequestMapping("/scheduler/o_end.do")   
  142. public String end(Integer id, HttpServletRequest request,   
  143. HttpServletResponse response, ModelMap model) {   
  144. manager.end(id);   
  145. CmsScheduler scheduler = manager.findById(id);   
  146. schedulerTaskManageSvc.stop(scheduler);   
  147. model.addAttribute("moduleType", scheduler.getModuleType());   
  148. log.info("end CmsScheduler id={}", id);   
  149. return "redirect:v_listBy.do";   
  150. }   
  151.   
  152.   
  153.   
  154.   
  155. private WebErrors validateEdit(Integer id, HttpServletRequest request) {   
  156. WebErrors errors = WebErrors.create(request);   
  157. CmsSite site = CmsUtils.getSite(request);   
  158. if (vldExist(id, site.getId(), errors)) {   
  159. return errors;   
  160. }   
  161. return errors;   
  162. }   
  163.   
  164. private WebErrors validateUpdate(Integer id, HttpServletRequest request) {   
  165. WebErrors errors = WebErrors.create(request);   
  166. CmsSite site = CmsUtils.getSite(request);   
  167. if (vldExist(id, site.getId(), errors)) {   
  168. return errors;   
  169. }   
  170. return errors;   
  171. }   
  172.   
  173. private WebErrors validateDelete(Integer[] ids, HttpServletRequest request) {   
  174. WebErrors errors = WebErrors.create(request);   
  175. CmsSite site = CmsUtils.getSite(request);   
  176. if (errors.ifEmpty(ids, "ids")) {   
  177. return errors;   
  178. }   
  179. for (Integer id : ids) {   
  180. vldExist(id, site.getId(), errors);   
  181. }   
  182. return errors;   
  183. }   
  184.   
  185. private boolean vldExist(Integer id, Integer siteId, WebErrors errors) {   
  186. if (errors.ifNull(id, "id")) {   
  187. return true;   
  188. }   
  189. CmsScheduler entity = manager.findById(id);   
  190. if (errors.ifNotExist(entity, CmsAcquisition.class, id)) {   
  191. return true;   
  192. }   
  193. return false;   
  194. }   
  195.   
  196.   
  197.   
  198. }   

Java代码   收藏代码
  1. 持久对象基类 BaseCmsScheduler.java   
  2. package com.jeecms.cms.entity.assist.base;   
  3.   
  4. import java.io.Serializable;   
  5. import java.util.Date;   
  6.   
  7.   
  8. public abstract class BaseCmsScheduler implements Serializable {   
  9.   
  10. public static String REF = "CmsScheduler";   
  11. public static String PROP_ID = "id";   
  12. public static String PROP_SITE = "site";   
  13. public static String PROP_ASSOCIATE_ID = "associateId";   
  14. public static String PROP_MODULE_TYPE = "moduleType";   
  15. public static String PROP_NAME = "name";   
  16. public static String PROP_START_TIME = "startTime";   
  17. public static String PROP_END_TIME = "endTime";   
  18. public static String PROP_STATUS = "status";   
  19. public static String PROP_EXPRESSION = "expression";   
  20.   
  21.   
  22.   
  23.   
  24. // constructors   
  25. public BaseCmsScheduler () {   
  26. initialize();   
  27. }   
  28.   
  29. /**  
  30.  * Constructor for primary key  
  31.  */   
  32. public BaseCmsScheduler (java.lang.Integer id) {   
  33. this.setId(id);   
  34. initialize();   
  35. }   
  36.        
  37. public BaseCmsScheduler(Integer id,String name, Date startTime, Date endTime,   
  38. Integer status, Integer associateId, String moduleType, String expression,com.jeecms.cms.entity.main.CmsSite site) {   
  39. super();   
  40. this.id = id;   
  41. this.name = name;   
  42. this.startTime = startTime;   
  43. this.endTime = endTime;   
  44. this.status = status;   
  45. this.associateId = associateId;   
  46. this.moduleType = moduleType;   
  47. this.expression = expression;   
  48. this.site = site;   
  49. }   
  50.   
  51. protected void initialize () {}   
  52.   
  53.   
  54.   
  55. private int hashCode = Integer.MIN_VALUE;   
  56.   
  57. // primary key   
  58. private java.lang.Integer id;   
  59.   
  60. // fields   
  61. private java.lang.String name;   
  62. private java.util.Date startTime;   
  63. private java.util.Date endTime;   
  64. private java.lang.Integer status;   
  65. private java.lang.Integer associateId;   
  66. private java.lang.String moduleType;   
  67. private java.lang.String expression;   
  68. private com.jeecms.cms.entity.main.CmsSite site;   
  69.   
  70.   
  71.   
  72.   
  73. public int getHashCode() {   
  74. return hashCode;   
  75. }   
  76.   
  77. public void setHashCode(int hashCode) {   
  78. this.hashCode = hashCode;   
  79. }   
  80.   
  81. public java.lang.Integer getId() {   
  82. return id;   
  83. }   
  84.   
  85. public void setId(java.lang.Integer id) {   
  86. this.id = id;   
  87. }   
  88.   
  89. public java.lang.String getName() {   
  90. return name;   
  91. }   
  92.   
  93. public void setName(java.lang.String name) {   
  94. this.name = name;   
  95. }   
  96.   
  97. public java.util.Date getStartTime() {   
  98. return startTime;   
  99. }   
  100.   
  101. public void setStartTime(java.util.Date startTime) {   
  102. this.startTime = startTime;   
  103. }   
  104.   
  105. public java.util.Date getEndTime() {   
  106. return endTime;   
  107. }   
  108.   
  109. public void setEndTime(java.util.Date endTime) {   
  110. this.endTime = endTime;   
  111. }   
  112.   
  113. public java.lang.Integer getStatus() {   
  114. return status;   
  115. }   
  116.   
  117. public void setStatus(java.lang.Integer status) {   
  118. this.status = status;   
  119. }   
  120.   
  121. public java.lang.Integer getAssociateId() {   
  122. return associateId;   
  123. }   
  124.   
  125. public void setAssociateId(java.lang.Integer associateId) {   
  126. this.associateId = associateId;   
  127. }   
  128.   
  129. public java.lang.String getModuleType() {   
  130. return moduleType;   
  131. }   
  132.   
  133. public void setModuleType(java.lang.String moduleType) {   
  134. this.moduleType = moduleType;   
  135. }   
  136. public java.lang.String getExpression() {   
  137. return expression;   
  138. }   
  139.   
  140. public void setExpression(java.lang.String expression) {   
  141. this.expression = expression;   
  142. }   
  143.   
  144. public com.jeecms.cms.entity.main.CmsSite getSite() {   
  145. return site;   
  146. }   
  147.   
  148. public void setSite(com.jeecms.cms.entity.main.CmsSite site) {   
  149. this.site = site;   
  150. }   
  151. }   
  152. 持久对象 CmsScheduler.java   
  153. package com.jeecms.cms.entity.assist;   
  154.   
  155.   
  156.   
  157. import java.util.Date;   
  158.   
  159. import com.jeecms.cms.entity.assist.base.BaseCmsScheduler;   
  160.   
  161. /**  
  162.  * 计划持久对象  
  163.  * @author javacoo  
  164.  * @since 2011-11-07  
  165.  */   
  166. public class CmsScheduler extends BaseCmsScheduler {   
  167. private static final long serialVersionUID = 1L;   
  168. /**  
  169.  * 停止状态  
  170.  */   
  171. public static final int STOP = 0;   
  172. /**  
  173.  * 采集状态  
  174.  */   
  175. public static final int START = 1;   
  176.   
  177. /**  
  178.  * 是否停止  
  179.  *   
  180.  * @return  
  181.  */   
  182. public boolean isStop() {   
  183. int status = getStatus();   
  184. return status == 0;   
  185. }   
  186.   
  187. public void init() {   
  188. if (getStatus() == null) {   
  189. setStatus(STOP);   
  190. }   
  191. }   
  192.   
  193.   
  194. public CmsScheduler(){   
  195. super();   
  196. }   
  197. public CmsScheduler(java.lang.Integer id){   
  198. super(id);   
  199. }   
  200. public CmsScheduler(Integer id,String name, Date startTime, Date endTime,   
  201. Integer status, Integer associateId, String moduleType, String expression,com.jeecms.cms.entity.main.CmsSite site) {   
  202. super(id,name,startTime,endTime,status,associateId,moduleType,expression,site);   
  203. }   
  204.   
  205.   
  206. }   

Java代码   收藏代码
  1. HBM文件 CmsScheduler.hbm.xml   
  2. <?xml version="1.0"?>   
  3. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
  4. <hibernate-mapping package="com.jeecms.cms.entity.assist">   
  5. <class name="CmsScheduler" table="jc_scheduler">   
  6. <meta attribute="sync-DAO">false</meta>   
  7. <id name="id" type="integer" column="scheduler_id"><generator class="identity"/></id>   
  8. <property name="associateId" column="associate_id" type="integer" not-null="true" length="11"/>   
  9. <property name="moduleType" column="module_type" type="string" not-null="false" length="100"/>   
  10. <property name="name" column="name" type="string" not-null="false" length="100"/>   
  11. <property name="startTime" column="start_time" type="timestamp" not-null="false" length="19"/>   
  12. <property name="endTime" column="end_time" type="timestamp" not-null="false" length="19"/>   
  13. <property name="status" column="status" type="integer" not-null="true" length="1"/>   
  14. <property name="expression" column="expression" type="string" not-null="true" length="50"/>   
  15. <many-to-one name="site" column="site_id" class="com.jeecms.cms.entity.main.CmsSite" not-null="true"></many-to-one>   
  16. </class>   
  17. </hibernate-mapping>   

Java代码   收藏代码
  1. ==============================定时任务模块相关互助类====================================   
  2. 计划框架   
  3. 计划框架-任务调度 Scheduler.java   
  4. package com.jeecms.common.scheduling.core;   
  5.   
  6. import java.util.Date;   
  7. import java.util.Timer;   
  8. import java.util.TimerTask;   
  9. /**  
  10.  * 计划框架-任务调度  
  11.  * <li>  
  12.  * 用于提供必要的计划,Scheduler 的每一个实例都拥有 Timer 的一个实例,用于提供底层计划  
  13.  * 它将一组单次定时器串接在一起,以便在由 ScheduleIterator 指定的各个时间执行 SchedulerTask 类  
  14.  * </li>  
  15.  * @author javacoo  
  16.  * @since 2011-11-02  
  17.  */   
  18. public class Scheduler {   
  19. /**Timer实例*/   
  20. private final Timer timer = new Timer();   
  21. /**  
  22.  * 定时任务计划  
  23.  * @author javacoo  
  24.  * @since 2011-11-02  
  25.  */   
  26. class SchedulerTimerTask extends TimerTask {   
  27. private SchedulerTask schedulerTask;   
  28. private ScheduleIterator iterator;   
  29.   
  30. public SchedulerTimerTask(SchedulerTask schedulerTask,   
  31. ScheduleIterator iterator) {   
  32. this.schedulerTask = schedulerTask;   
  33. this.iterator = iterator;   
  34. }   
  35.   
  36. public void run() {   
  37. schedulerTask.run();   
  38. reschedule(schedulerTask, iterator);   
  39. }   
  40. }   
  41.   
  42. public Scheduler() {   
  43. }   
  44.     /**  
  45.      * 取消执行  
  46.      */   
  47. public void cancel() {   
  48. timer.cancel();   
  49. }   
  50. /**  
  51.  * 计划的入口点  
  52.  * <li>  
  53.  * 通过调用 ScheduleIterator 接口的 next(),发现第一次执行 SchedulerTask 的时间。  
  54.  * 然后通过调用底层 Timer 类的单次 schedule() 方法,启动计划在这一时刻执行。  
  55.  * 为单次执行提供的 TimerTask 对象是嵌入的 SchedulerTimerTask 类的一个实例,  
  56.  * 它包装了任务和迭代器(iterator)。在指定的时间,调用嵌入类的 run() 方法,  
  57.  * 它使用包装的任务和迭代器引用以便重新计划任务的下一次执行  
  58.  * </li>  
  59.  * @param schedulerTask SchedulerTimerTask 类的一个实例  
  60.  * @param iterator ScheduleIterator 接口的一个实例  
  61.  */   
  62. public void schedule(SchedulerTask schedulerTask, ScheduleIterator iterator) {   
  63. Date time = iterator.next();   
  64. if (time == null) {   
  65. schedulerTask.cancel();   
  66. else {   
  67. synchronized (schedulerTask.lock) {   
  68. if (schedulerTask.state != SchedulerTask.VIRGIN) {   
  69. throw new IllegalStateException("任务已经执行/取消");   
  70. }   
  71. schedulerTask.state = SchedulerTask.SCHEDULED;   
  72. schedulerTask.timerTask = new SchedulerTimerTask(schedulerTask,iterator);   
  73. timer.schedule(schedulerTask.timerTask, time);   
  74. }   
  75. }   
  76. }   
  77.     /**  
  78.      * 重新制定计划  
  79.      * @param schedulerTask SchedulerTimerTask 类的一个实例  
  80.      * @param iterator ScheduleIterator 接口的一个实例  
  81.      */   
  82. private void reschedule(SchedulerTask schedulerTask,   
  83. ScheduleIterator iterator) {   
  84. Date time = iterator.next();   
  85. if (time == null) {   
  86. schedulerTask.cancel();   
  87. else {   
  88. synchronized (schedulerTask.lock) {   
  89. if (schedulerTask.state != SchedulerTask.CANCELLED) {   
  90. schedulerTask.timerTask = new SchedulerTimerTask(   
  91. schedulerTask, iterator);   
  92. timer.schedule(schedulerTask.timerTask, time);   
  93. }   
  94. }   
  95. }   
  96. }   
  97.   
  98. }   

Java代码   收藏代码
  1. 计划框架-时间生成器接口 ScheduleIterator.java   
  2. package com.jeecms.common.scheduling.core;   
  3.   
  4. import java.util.Date;   
  5. /**  
  6.  * 计划框架-时间生成器接口  
  7.  * <li>将 SchedulerTask 的计划执行时间指定为一系列 java.util.Date 对象的接口  
  8.  * 然后 next() 方法按时间先后顺序迭代 Date 对象,返回值 null 会使任务取消(即它再也不会运行)</li>  
  9.  * @author javacoo  
  10.  * @since 2011-11-02  
  11.  */   
  12. public interface ScheduleIterator {   
  13. /**  
  14.  * 返回下次计划执行时间  
  15.  * @return 下次计划执行时间  
  16.  */   
  17. Date next();   
  18. }   

Java代码   收藏代码
  1. 计划任务抽象类 SchedulerTask.java   
  2. package com.jeecms.common.scheduling.core;   
  3.   
  4. import java.util.TimerTask;   
  5. /**  
  6.  * 计划任务抽象类  
  7.  * <li>  
  8.  * SchedulerTask 在其生命周期中要经历一系列的状态。创建后,它处于 VIRGIN 状态,  
  9.  * 这表明它从没有计划过。计划以后,它就变为 SCHEDULED 状态,  
  10.  * 再用下面描述的方法之一取消任务后,它就变为 CANCELLED 状态。  
  11.  * 管理正确的状态转变 —— 如保证不对一个非 VIRGIN 状态的任务进行两次计划 ——   
  12.  * 增加了 Scheduler 和 SchedulerTask 类的复杂性。在进行可能改变任务状态的操作时,  
  13.  * 代码必须同步任务的锁对象  
  14.  * </li>  
  15.  * @author javacoo  
  16.  * @since 2011-11-02  
  17.  */   
  18. public abstract class SchedulerTask implements Runnable {   
  19. /**同步任务的锁对象*/   
  20. final Object lock = new Object();   
  21.     /**状态*/   
  22. int state = VIRGIN;   
  23. /**初始状态*/   
  24. static final int VIRGIN = 0;   
  25. /**任务状态*/   
  26. static final int SCHEDULED = 1;   
  27. /**取消状态*/   
  28. static final int CANCELLED = 2;   
  29. /**TimerTask 对象*/   
  30. TimerTask timerTask;   
  31.   
  32. protected SchedulerTask() {   
  33. }   
  34.     /**执行的任务,由子类实现*/   
  35. public abstract void run();   
  36.     /**取消任务  
  37.      * <li>  
  38.      * 任务再也不会运行了,不过已经运行的任务仍会运行完成  
  39.      * </li>  
  40.      */   
  41. public boolean cancel() {   
  42. synchronized (lock) {   
  43. if (timerTask != null) {   
  44. timerTask.cancel();   
  45. }   
  46. boolean result = (state == SCHEDULED);   
  47. state = CANCELLED;   
  48. return result;   
  49. }   
  50. }   
  51.   
  52. public long scheduledExecutionTime() {   
  53. synchronized (lock) {   
  54. return timerTask == null ? 0 : timerTask.scheduledExecutionTime();   
  55. }   
  56. }   
  57.   
  58. }   

Java代码   收藏代码
  1. 计划框架-时间生成器接口实现类 SimpleScheduleIterator.java   
  2. package com.jeecms.common.scheduling.impl;   
  3. import java.util.Calendar;   
  4. import java.util.Date;   
  5. import java.util.GregorianCalendar;   
  6.   
  7. import com.jeecms.common.scheduling.core.ScheduleIterator;   
  8. /**  
  9.  * 计划框架-时间生成器接口实现类  
  10.  * <li>返回 月/周/天/小时/分钟/秒 计划的下一次执行时间</li>  
  11.  * <li>约定:参数以逗号分隔,*号表示无值</li>  
  12.  * <li>参数解释:  
  13.  * <br>第一位:每个月的第几周</br>  
  14.  * <br>第二位:每周的第几天</br>  
  15.  * <br>第三位:天(几号)</br>  
  16.  * <br>第四位:小时(24小时制)</br>  
  17.  * <br>第五位:分钟</br>  
  18.  * <br>第六位:秒</br>  
  19.  * </li>  
  20.  * <li>参数样例:  
  21.  *  <br> 1,6,4,15,20,30       表示 从今天的15:20:30开始,每隔一个月执行一次,即下次执行时间是  下个月的第一周的第6天的15:20:30</br>  
  22.  *  <br> *,6,4,15,20,30       表示 从今天的15:20:30开始,每隔一周执行一次,即下次执行时间是  下一周的第6天的15:20:30</br>  
  23.  *  <br> *,*,4,15,20,30       表示 从今天的15:20:30开始,每隔一天执行一次,即下次执行时间是  下一天的15:20:30</br>   
  24.  *  <br> *,*,*,15,20,30       表示 从今天的15:20:30开始,每隔一小时执行一次,即下次执行时间是  16:20:30</br>  
  25.  *  <br> *,*,*,*,20,30        表示 从这个小时的20:30开始,每隔一分钟执行一次,即下次执行时间是  *:21:30</br>  
  26.  *  <br> *,*,*,*,*,30         表示 从当前时间的30秒开始,每隔一秒执行一次,即下次执行时间是  *:*:31</br>  
  27.  * </li>  
  28.  * @author javacoo  
  29.  * @since 2011-11-03  
  30.  */   
  31. public class SimpleScheduleIterator implements ScheduleIterator {   
  32. private final ScheduleParamBean scheduleParamBean;   
  33. private final Calendar calendar = Calendar.getInstance();   
  34. private final Calendar orginCalendar = Calendar.getInstance();   
  35. public SimpleScheduleIterator(final ScheduleParamBean scheduleParamBean) {   
  36. this(scheduleParamBean, new Date());   
  37. }   
  38.   
  39. public SimpleScheduleIterator(final ScheduleParamBean scheduleParamBean, Date date) {   
  40. this.scheduleParamBean = scheduleParamBean;   
  41.   
  42. orginCalendar.setTime(date);   
  43. calendar.setTime(date);   
  44. if(null != scheduleParamBean.getWeekOfMonth()){   
  45. calendar.set(Calendar.WEEK_OF_MONTH, scheduleParamBean.getWeekOfMonth());   
  46. }   
  47. //如果设置了每周的第几天和一个月的第几天,则忽略一个月的第几天   
  48. if(null != scheduleParamBean.getDayOfWeek()){   
  49. calendar.set(Calendar.DAY_OF_WEEK, scheduleParamBean.getDayOfWeek());   
  50. }else if(null != scheduleParamBean.getDayOfMonth()){   
  51. calendar.set(Calendar.DAY_OF_MONTH, scheduleParamBean.getDayOfMonth());   
  52. }   
  53. if(null != scheduleParamBean.getHourOfDay()){   
  54. calendar.set(Calendar.HOUR_OF_DAY, scheduleParamBean.getHourOfDay());   
  55. }   
  56. if(null != scheduleParamBean.getMinute()){   
  57. calendar.set(Calendar.MINUTE, scheduleParamBean.getMinute());   
  58. }   
  59. if(null != scheduleParamBean.getSecond()){   
  60. calendar.set(Calendar.SECOND, scheduleParamBean.getSecond());   
  61. }   
  62. calendar.set(Calendar.MILLISECOND, 0);   
  63. //如果设置时间 大于当前时间   
  64. if (!calendar.getTime().before(date)) {   
  65. System.out.println(calendar.getTime() +"大于当前时间:"+date);   
  66. if(null != scheduleParamBean.getWeekOfMonth()){   
  67. calendar.add(Calendar.MONTH, -1);   
  68. }else if(null != scheduleParamBean.getDayOfWeek()){   
  69. calendar.add(Calendar.DAY_OF_WEEK, -6);   
  70. }else if(null != scheduleParamBean.getDayOfMonth()){   
  71. calendar.add(Calendar.DAY_OF_MONTH, -1);   
  72. }else if(null != scheduleParamBean.getHourOfDay()){   
  73. calendar.add(Calendar.HOUR_OF_DAY, -1);   
  74. }else if(null != scheduleParamBean.getMinute()){   
  75. calendar.add(Calendar.MINUTE, -1);   
  76. }else if(null != scheduleParamBean.getSecond()){   
  77. calendar.add(Calendar.SECOND, -1);   
  78. }   
  79. }else{//如果小于,则会一下执行多次,所以在天,小时,分钟,秒 都加上相应时间差   
  80. System.out.println(calendar.getTime() +"小于当前时间:"+date);   
  81. if(null != scheduleParamBean.getDayOfMonth()){   
  82. calendar.add(Calendar.DAY_OF_MONTH, orginCalendar.get(Calendar.DAY_OF_MONTH) - scheduleParamBean.getDayOfMonth());   
  83. }else if(null != scheduleParamBean.getHourOfDay()){   
  84. calendar.add(Calendar.HOUR_OF_DAY, orginCalendar.get(Calendar.HOUR_OF_DAY) - scheduleParamBean.getHourOfDay());   
  85. }else if(null != scheduleParamBean.getMinute()){   
  86. calendar.add(Calendar.MINUTE, orginCalendar.get(Calendar.MINUTE) - scheduleParamBean.getMinute());   
  87. }else if(null != scheduleParamBean.getSecond()){   
  88. calendar.add(Calendar.SECOND, orginCalendar.get(Calendar.SECOND) - scheduleParamBean.getSecond());   
  89. }   
  90. }   
  91. }   
  92.   
  93. public Date next() {   
  94. if(null != scheduleParamBean.getWeekOfMonth()){   
  95. calendar.add(Calendar.MONTH, 1);   
  96. }else if(null != scheduleParamBean.getDayOfWeek()){   
  97. calendar.add(Calendar.DAY_OF_WEEK, 6);   
  98. }else if(null != scheduleParamBean.getDayOfMonth()){   
  99. calendar.add(Calendar.DAY_OF_MONTH, 1);   
  100. }else if(null != scheduleParamBean.getHourOfDay()){   
  101. calendar.add(Calendar.HOUR_OF_DAY, 1);   
  102. }else if(null != scheduleParamBean.getMinute()){   
  103. calendar.add(Calendar.MINUTE, 1);   
  104. }else if(null != scheduleParamBean.getSecond()){   
  105. calendar.add(Calendar.SECOND, 1);   
  106. }   
  107. System.out.println("下次执行时间:"+calendar.getTime());   
  108. return calendar.getTime();   
  109. }   
  110.   
  111.   
  112. }   
  113.   
  114. 时间计划参数bean ScheduleParamBean.java   
  115. package com.jeecms.common.scheduling.impl;   
  116. /**  
  117.  * 时间计划参数bean  
  118.  * @author javacoo  
  119.  * @since 2011-11-04  
  120.  */   
  121. public class ScheduleParamBean {   
  122. /**每个月的第几周,每周的第几天,每个月的第几天,小时(24小时制),分钟,秒*/   
  123. private Integer weekOfMonth,dayOfWeek,dayOfMonth,hourOfDay, minute, second;   
  124.   
  125. public ScheduleParamBean(){   
  126.   
  127. }   
  128.   
  129. public ScheduleParamBean(Integer weekOfMonth, Integer dayOfWeek,   
  130. Integer dayOfMonth, Integer hourOfDay, Integer minute,   
  131. Integer second) {   
  132. super();   
  133. this.weekOfMonth = weekOfMonth;   
  134. this.dayOfWeek = dayOfWeek;   
  135. this.dayOfMonth = dayOfMonth;   
  136. this.hourOfDay = hourOfDay;   
  137. this.minute = minute;   
  138. this.second = second;   
  139. }   
  140.   
  141. public Integer getWeekOfMonth() {   
  142. return weekOfMonth;   
  143. }   
  144.   
  145. public void setWeekOfMonth(Integer weekOfMonth) {   
  146. this.weekOfMonth = weekOfMonth;   
  147. }   
  148.   
  149. public Integer getDayOfWeek() {   
  150. return dayOfWeek;   
  151. }   
  152.   
  153. public void setDayOfWeek(Integer dayOfWeek) {   
  154. this.dayOfWeek = dayOfWeek;   
  155. }   
  156.   
  157. public Integer getDayOfMonth() {   
  158. return dayOfMonth;   
  159. }   
  160.   
  161. public void setDayOfMonth(Integer dayOfMonth) {   
  162. this.dayOfMonth = dayOfMonth;   
  163. }   
  164.   
  165. public Integer getHourOfDay() {   
  166. return hourOfDay;   
  167. }   
  168.   
  169. public void setHourOfDay(Integer hourOfDay) {   
  170. this.hourOfDay = hourOfDay;   
  171. }   
  172.   
  173. public Integer getMinute() {   
  174. return minute;   
  175. }   
  176.   
  177. public void setMinute(Integer minute) {   
  178. this.minute = minute;   
  179. }   
  180.   
  181. public Integer getSecond() {   
  182. return second;   
  183. }   
  184.   
  185. public void setSecond(Integer second) {   
  186. this.second = second;   
  187. }   
  188.   
  189. @Override   
  190. public String toString() {   
  191. return "ScheduleParamBean [dayOfMonth=" + dayOfMonth + ", dayOfWeek="   
  192. + dayOfWeek + ", hourOfDay=" + hourOfDay + ", minute=" + minute   
  193. ", second=" + second + ", weekOfMonth=" + weekOfMonth + "]";   
  194. }   
  195.   
  196.   
  197.   
  198.   
  199. }   

Java代码   收藏代码
  1. 采集相关   
  2. HTML解析工具类接口 ParseHtmlTool.java   
  3. package com.jeecms.common.crawler.util;   
  4.   
  5. import java.util.List;   
  6. import java.util.Map;   
  7.   
  8. /**  
  9.  * HTML解析工具类接口  
  10.  * @author javacoo  
  11.  * @since 2011-10-31  
  12.  */   
  13. public interface ParseHtmlTool {   
  14. /**  
  15.  * 取得连接集合  
  16.  * @param orginHtml 原始HTML  
  17.  * @return 连接集合  
  18.  */   
  19. List<String> getUrlList( String orginHtml);   
  20. /**  
  21.  * 取得标题集合  
  22.  * @param orginHtml 原始HTML  
  23.  * @return 标题集合  
  24.  */   
  25. List<String> getTitleList(String orginHtml);   
  26.     /**  
  27.      * 取得指定区域的HTML内容  
  28.      * @return 指定区域的HTML内容  
  29.      */   
  30. String getHtml(String orginHtml);   
  31. /**  
  32.  * 取得连接标题Map集合  
  33.  * @param orginHtml 原始HTML  
  34.  * @return 连接标题Map集合  
  35.  */   
  36. List<Map<String,String>> getUrlAndTitleMap(String orginHtml);   
  37. }   

Java代码   收藏代码
  1. HTML解析工具,HtmlParser实现类 HtmlParserImpl.java   
  2. package com.jeecms.common.crawler.util;   
  3.   
  4. import java.io.BufferedReader;   
  5. import java.io.File;   
  6. import java.io.FileInputStream;   
  7. import java.io.IOException;   
  8. import java.io.InputStreamReader;   
  9. import java.net.URISyntaxException;   
  10. import java.util.ArrayList;   
  11. import java.util.HashMap;   
  12. import java.util.Iterator;   
  13. import java.util.List;   
  14. import java.util.Map;   
  15. import java.util.regex.Matcher;   
  16. import java.util.regex.Pattern;   
  17.   
  18. import org.apache.commons.lang.StringUtils;   
  19. import org.htmlparser.Node;   
  20. import org.htmlparser.NodeFilter;   
  21. import org.htmlparser.Parser;   
  22. import org.htmlparser.filters.HasAttributeFilter;   
  23. import org.htmlparser.filters.NodeClassFilter;   
  24. import org.htmlparser.filters.TagNameFilter;   
  25. import org.htmlparser.nodes.RemarkNode;   
  26. import org.htmlparser.util.NodeList;   
  27. import org.htmlparser.util.ParserException;   
  28.   
  29. import com.jeecms.cms.entity.assist.CmsAcquisition;   
  30. import com.jeecms.common.crawler.ParamBean;   
  31. /**  
  32.  * HTML解析工具,HtmlParser实现类  
  33.  * @author javacoo  
  34.  * @since 2011-10-31  
  35.  */   
  36. public class HtmlParserImpl implements ParseHtmlTool{   
  37. /**连接集合标志*/   
  38.     private static String LINK_KEY = "linkKey";   
  39.     /**标题集合标志*/   
  40. private static String TITLE_KEY = "titleKey";   
  41. /**单标签标志*/   
  42. private static String SINGLE_TAG = "singleTag";   
  43. /**连接正则表达式*/   
  44. private static String LINK_REGX = "<a.*href=\"(.*?)\".*>(.*?)</a>";   
  45. /**正则表达式对象*/   
  46. private Pattern pt = Pattern.compile(LINK_REGX);   
  47. /**采集参数bean*/   
  48. private ParamBean paramBean;   
  49.   
  50. public HtmlParserImpl(CmsAcquisition acqu){   
  51. parseRequestParam(acqu);   
  52. }   
  53.   
  54. /**  
  55.  * 取得标题集合  
  56.  * @param orginHtml 原始HTML  
  57.  * @return 标题集合  
  58.  */   
  59. public List<String> getTitleList(String orginHtml) {   
  60. orginHtml = getHtmlByFilter(paramBean.getLinksetStartMap(), paramBean.getLinksetEndMap(),orginHtml);   
  61. if (StringUtils.isNotEmpty(orginHtml)) {   
  62. return getUrlOrTitleListByType(orginHtml,TITLE_KEY);   
  63. }   
  64. return null;   
  65. }   
  66.   
  67. /**  
  68.  * 取得连接集合  
  69.  * @param orginHtml 原始HTML  
  70.  * @return 连接集合  
  71.  */   
  72. public List<String> getUrlList(String orginHtml) {   
  73. orginHtml = getHtmlByFilter(paramBean.getLinksetStartMap(), paramBean.getLinksetEndMap(),orginHtml);   
  74. if (StringUtils.isNotEmpty(orginHtml)) {   
  75. return getUrlOrTitleListByType(orginHtml,LINK_KEY);   
  76. }   
  77. return null;   
  78. }   
  79. /**  
  80.      * 取得指定区域的HTML内容  
  81.      * @param orginHtml 原始HTML  
  82.      * @return 指定区域的HTML内容  
  83.      * @throws ParserException  
  84.      */   
  85. public String getHtml(String orginHtml) {   
  86. orginHtml = getHtmlByFilter(paramBean.getContentStartMap(), paramBean.getContentEndMap(),orginHtml);   
  87. return orginHtml;   
  88. }   
  89. /**  
  90.  * 取得连接标题Map  
  91.  * @param orginHtml 原始HTML  
  92.  * @return 连接标题Map  
  93.  */   
  94. public List<Map<String,String>> getUrlAndTitleMap(String orginHtml){   
  95. return getUrlAandTitleMap(orginHtml);   
  96. }   
  97. /**  
  98.  * 解析采集参数,并封装到ParamBean  
  99.  * @param acqu 原始采集参数  
  100.  * @return 采集参数封装bean  
  101.  */   
  102. private void parseRequestParam(CmsAcquisition acqu){   
  103. paramBean = new ParamBean();   
  104. if(!StringUtils.isEmpty(acqu.getLinksetStart())){   
  105. paramBean.setLinksetStartMap(populateParamMap(acqu.getLinksetStart()));   
  106. }   
  107. if(!StringUtils.isEmpty(acqu.getLinksetEnd())){   
  108. paramBean.setLinksetEndMap(populateParamMap(acqu.getLinksetEnd()));   
  109. }   
  110. if(!StringUtils.isEmpty(acqu.getContentStart())){   
  111. paramBean.setContentStartMap(populateParamMap(acqu.getContentStart()));   
  112. }   
  113. if(!StringUtils.isEmpty(acqu.getContentEnd())){   
  114. paramBean.setContentEndMap(populateParamMap(acqu.getContentEnd()));   
  115. }   
  116. }   
  117. /**  
  118.  * 得到连接标题MAP  
  119.  * @param html html内容  
  120.  * @return 连接或者标题集合  
  121.  */   
  122. private List<Map<String,String>> getUrlAandTitleMap(String html) {   
  123. html = getHtmlByFilter(paramBean.getLinksetStartMap(), paramBean.getLinksetEndMap(),html);   
  124. List<Map<String,String>> resultMapList = new ArrayList<Map<String,String>>();   
  125. Map<String,String> resultMap = null;   
  126. Matcher m = pt.matcher(html);   
  127. while (m.find()) {   
  128. if(StringUtils.isNotEmpty(m.group(1)) && StringUtils.isNotEmpty(m.group(2))){   
  129. resultMap = new HashMap<String, String>();   
  130. resultMap.put(LINK_KEY, m.group(1));   
  131. resultMap.put(TITLE_KEY, m.group(2));   
  132. resultMapList.add(resultMap);   
  133. }   
  134. }   
  135. return resultMapList;   
  136. }   
  137. /**  
  138.  * 得到地址集  
  139.  * @param html html内容  
  140.  * @param type 1 :取得连接集合,2:取得标题集合  
  141.  * @return 连接或者标题集合  
  142.  */   
  143. private List<String> getUrlOrTitleListByType(String html, String type) {   
  144. List<String> resultList = new ArrayList<String>();   
  145. Matcher m = pt.matcher(html);   
  146. String result = "";   
  147. int pos = 1;   
  148. if(TITLE_KEY.equals(type)){   
  149. pos = 2;   
  150. }   
  151. while (m.find()) {   
  152. result = m.group(pos);   
  153. resultList.add(result);   
  154. }   
  155. return resultList;   
  156. }   
  157. /**  
  158.      * 取得指定区域的HTML内容  
  159.      * @param tagMap 标签MAP  
  160.      * @param removeTagMap 要过滤的标签MAP  
  161.      * @param orginHtml 原始HTML  
  162.      * @return 指定区域的HTML内容  
  163.      * @throws ParserException  
  164.      */   
  165. private String getHtmlByFilter(Map<String, String> tagMap,   
  166. Map<String, String> removeTagMap, String orginHtml) {   
  167. try {   
  168. Parser parser = new Parser();   
  169. parser.setInputHTML(orginHtml);   
  170. // 第一步取得指定属性/标签内容   
  171. String tempKey = null;   
  172. String tempValue = null;   
  173. String[] tempValueArr = null;   
  174. StringBuilder sb = new StringBuilder();   
  175. NodeFilter filter = null;   
  176. for(Iterator<String> it = tagMap.keySet().iterator(); it.hasNext();){   
  177. tempKey = it.next();   
  178. tempValue = tagMap.get(tempKey);   
  179. if(tempValue.contains("|")){   
  180. tempValueArr = tempValue.split("\\|");   
  181. }else{   
  182. tempValueArr = new String[]{tempValue};   
  183. }   
  184. for(String value : tempValueArr){   
  185. filter = populateFilter(tempKey,value);   
  186. appendHtmlByFilter(parser, filter, sb);   
  187. }   
  188. }   
  189. // 第二步过滤指定属性/标签内容   
  190. String contentHtml = sb.toString();   
  191. for (Iterator<String> it = removeTagMap.keySet().iterator(); it   
  192. .hasNext();) {   
  193. tempKey = it.next();   
  194. tempValue = removeTagMap.get(tempKey);   
  195. if(tempValue.contains("|")){   
  196. tempValueArr = tempValue.split("\\|");   
  197. }else{   
  198. tempValueArr = new String[]{tempValue};   
  199. }   
  200. for(String value : tempValueArr){   
  201. filter = populateFilter(tempKey,value);   
  202. contentHtml = removeHtmlByFilter(parser, filter, contentHtml);   
  203. }   
  204. }   
  205. //第三步过滤注释   
  206. filter = new NodeClassFilter(RemarkNode.class);   
  207. contentHtml = removeHtmlByFilter(parser, filter, contentHtml);   
  208. System.out.println("=================================结果=======================================");   
  209. System.out.println(contentHtml);   
  210. return contentHtml;   
  211. catch (ParserException e) {   
  212. // TODO Auto-generated catch block   
  213. e.printStackTrace();   
  214. }   
  215. return "";   
  216. }   
  217.   
  218. /**  
  219.  * 解析并组装采集参数,支持标签属性/值形式和标签名称形式,可混合使用  
  220.  * <li>约定采集参数格式如下</li>  
  221.  * <li>1,标签属性/值形式,如:class=articleList|tips,id=fxwb|fxMSN|fxMSN</li>  
  222.  * <li>2,标签名称形式,如:div,p,span</li>  
  223.  * <li>3,混合形式,如:class=articleList|tips,id=fxwb|fxMSN|fxMSN,div,p,span</li>  
  224.  * @param paramStr 参数字符串  
  225.  */   
  226. private Map<String, String> populateParamMap(String paramStr) {   
  227. Map<String, String> paramMap = new HashMap<String, String>();   
  228. String[] paramStrArr = paramStr.split(",");   
  229. String[] tempStrArr = null;   
  230. StringBuilder sb = new StringBuilder();   
  231. for(String temp : paramStrArr){   
  232. if(temp.contains("=")){   
  233. tempStrArr = temp.split("=");   
  234. paramMap.put(tempStrArr[0], tempStrArr[1]);   
  235. }else{   
  236. if(StringUtils.isNotEmpty(temp)){   
  237. sb.append(temp).append("|");   
  238. }   
  239. }   
  240. }   
  241. if(StringUtils.isNotEmpty(sb.toString())){   
  242. paramMap.put(SINGLE_TAG, sb.substring(0, sb.length() - 1));   
  243. }   
  244. return paramMap;   
  245. }   
  246. /**  
  247.  * 组装过滤器  
  248.  * @param key 键  
  249.  * @param value 值  
  250.  * @return 过滤器  
  251.  */   
  252. private NodeFilter populateFilter(String key,String value) {   
  253. NodeFilter filter;   
  254. if(SINGLE_TAG.equals(key)){   
  255. filter =  new TagNameFilter(value);   
  256. }else{   
  257. filter = new HasAttributeFilter(key,value);   
  258. }   
  259. return filter;   
  260. }   
  261. /**  
  262.      * 过滤指定属性标签HTML  
  263.      * @param parser 解析器  
  264.      * @param filter 属性过滤器  
  265.      * @param orginHtml 原始HTML  
  266.      * @return 过滤后HTML  
  267.      * @throws ParserException  
  268.      */   
  269. private String removeHtmlByFilter(Parser parser, NodeFilter filter,String orginHtml) throws ParserException {   
  270. parser.setInputHTML(orginHtml);   
  271. NodeList nodes = parser.extractAllNodesThatMatch(filter);   
  272. for (int i = 0; i < nodes.size(); i++) {   
  273. Node textnode = (Node) nodes.elementAt(i);   
  274. orginHtml = StringUtils.remove(orginHtml, textnode.toHtml());   
  275. }   
  276. return orginHtml;   
  277. }   
  278. /**  
  279.  * 取得所有指定属性/标签的HTML  
  280.  * @param parser 解析器  
  281.  * @param filter 过滤器  
  282.  * @param sb   
  283.  * @throws ParserException  
  284.  */   
  285. private void appendHtmlByFilter(Parser parser, NodeFilter filter,   
  286. StringBuilder sb) throws ParserException {   
  287. NodeList nodes = parser.extractAllNodesThatMatch(filter);   
  288. for (int i = 0; i < nodes.size(); i++) {   
  289. Node textnode = (Node) nodes.elementAt(i);   
  290. sb.append(textnode.toHtml());   
  291. }   
  292. }   
  293.   
  294. /**  
  295.  * 解析并组装采集参数,支持标签属性/值形式和标签名称形式,可混合使用  
  296.  * <li>约定采集参数格式如下</li>  
  297.  * <li>1,标签属性/值形式,如:class=articleList|tips,id=fxwb|fxMSN|fxMSN</li>  
  298.  * <li>2,标签名称形式,如:div,p,span</li>  
  299.  * <li>3,混合形式,如:class=articleList|tips,id=fxwb|fxMSN|fxMSN,div,p,span</li>  
  300.  * @param paramMap 参数map  
  301.  * @param str 参数字符串  
  302.  */   
  303. private void populateParamMap(Map<String, String> paramMap,String paramStr) {   
  304. String[] paramStrArr = paramStr.split(",");   
  305. String[] tempStrArr = null;   
  306. StringBuilder sb = new StringBuilder();   
  307. for(String temp : paramStrArr){   
  308. if(temp.contains("=")){   
  309. tempStrArr = temp.split("=");   
  310. paramMap.put(tempStrArr[0], tempStrArr[1]);   
  311. }else{   
  312. if(StringUtils.isNotEmpty(temp)){   
  313. sb.append(temp).append("|");   
  314. }   
  315. }   
  316. }   
  317. if(StringUtils.isNotEmpty(sb.toString())){   
  318. paramMap.put(SINGLE_TAG, sb.substring(0, sb.length() - 1));   
  319. }   
  320. }   
  321.   
  322.     /**  
  323.      * 测试方法-打开文件并返回内容  
  324.      * @param szFileName 文件绝对地址  
  325.      * @param charset 字符集  
  326.      * @return 内容  
  327.      */   
  328. public static String openFile(String szFileName,String charset) {   
  329. try {   
  330. BufferedReader bis = new BufferedReader(new InputStreamReader(   
  331. new FileInputStream(new File(szFileName)), charset));   
  332. StringBuilder szContent = new StringBuilder();   
  333. String szTemp;   
  334.   
  335. while ((szTemp = bis.readLine()) != null) {   
  336. szContent.append(szTemp).append("\n");   
  337. }   
  338. bis.close();   
  339. return szContent.toString();   
  340. catch (Exception e) {   
  341. return "";   
  342. }   
  343. }   
  344. /**  
  345.  * 测试取得连接地址和标题  
  346.  * @throws ParserException  
  347.  */   
  348. public void testFetchLinkAndTitle() throws ParserException{   
  349. String html = openFile("F:\\4.htm","UTF-8");   
  350. String result = "";   
  351. Map<String, String> map = new HashMap<String, String>();   
  352. map.put("class""m_list");   
  353. Map<String, String> notMap = new HashMap<String, String>();   
  354. //notMap.put("class", "atc_ic_f");   
  355. result = getHtmlByFilter(map,notMap,html);   
  356. System.out.println("=============================result============================");   
  357. System.out.println(result);   
  358. System.out.println("==========================================================");   
  359. Pattern pt = Pattern.compile("<a.*href=\"(.*?)\".*>(.*?)</a>");   
  360.   
  361. Matcher m = pt.matcher(result);   
  362.         String link = null;   
  363.         String title = null;   
  364. while (m.find()) {   
  365. link = m.group(1);   
  366. title = m.group(2);   
  367. if (StringUtils.isNotEmpty(link)) {   
  368. System.out.println("url : " + link);   
  369. System.out.println("title : " + title);   
  370. }   
  371. }   
  372. }   
  373. /**  
  374.  * 测试取得内容  
  375.  * @throws ParserException  
  376.  */   
  377. public void testFetchContent() throws ParserException{   
  378. String html = openFile("F:\\6.shtml","GB2312");   
  379. Map<String, String> map = new HashMap<String, String>();   
  380. map.put("id""artibody");   
  381. Map<String, String> notMap = new HashMap<String, String>();   
  382. notMap.put(SINGLE_TAG, "style|script");   
  383. notMap.put("type""text/javascript");   
  384. notMap.put("class""icon_fx|blkComment otherContent_01");   
  385. notMap.put("style""text-align: right;padding-right:10px;|margin-top:6px;|font-size: 12px ! important;|font-size:12px");   
  386. notMap.put("id""fxwb|fxMSN|fxMSN|comment_t_show_top");   
  387. getHtmlByFilter(map,notMap,html);   
  388. }   
  389. /**  
  390.  * 测试解析参数  
  391.  */   
  392. public void testParseParam(){   
  393. Map<String, String> map = new HashMap<String, String>();   
  394. populateParamMap(map,"class=articleList|tips,p,div");   
  395. String tempKey = null;   
  396. String tempValue = null;   
  397. String[] tempValueArr = null;   
  398. for (Iterator<String> it = map.keySet().iterator(); it.hasNext();) {   
  399. tempKey = it.next();   
  400. tempValue = map.get(tempKey);   
  401. if(tempValue.contains("|")){   
  402. tempValueArr = tempValue.split("\\|");   
  403. }else{   
  404. tempValueArr = new String[]{tempValue};   
  405. }   
  406. for(String value : tempValueArr){   
  407. System.out.println("tempKey:" + tempKey);   
  408. System.out.println("value:" + value);   
  409. }   
  410. }   
  411. }   
  412. /**  
  413.  * 测试过滤标签  
  414.  * @throws ParserException  
  415.  */   
  416. public void testRemarkFilter() throws ParserException{   
  417. String html = openFile("F:\\6.shtml","GB2312");   
  418. System.out.println("=========================过滤注释前HTML==================================");   
  419. System.out.println(html);   
  420. NodeFilter filter = new NodeClassFilter(RemarkNode.class);   
  421. html = removeHtmlByFilter(new Parser(), filter, html);   
  422. System.out.println("=========================过滤注释后HTML==================================");   
  423. System.out.println(html);   
  424. }   
  425. public static void main(String[] args) throws ParserException,   
  426. URISyntaxException, IOException {   
  427. HtmlParserImpl parseHtmlTool = new HtmlParserImpl(new CmsAcquisition());   
  428. //parseHtmlTool.testParseParam();   
  429. //parseHtmlTool.testFetchLinkAndTitle();   
  430. //parseHtmlTool.testFetchContent();   
  431. //parseHtmlTool.testRemarkFilter();   
  432. }   
  433.   
  434. }   

Java代码   收藏代码
  1. 采集参数封装bean ParamBean.java   
  2. package com.jeecms.common.crawler;   
  3.   
  4. import java.util.HashMap;   
  5. import java.util.Map;   
  6. /**  
  7.  * 采集参数封装bean  
  8.  * @author javacoo  
  9.  * @since 2011-10-31  
  10.  */   
  11. public class ParamBean {   
  12. /**待采集连接区域属性MAP*/   
  13. private Map<String, String> linksetStartMap = new HashMap<String, String>();   
  14. /**待采集连接区域过滤属性MAP*/   
  15. private Map<String, String> linksetEndMap = new HashMap<String, String>();   
  16. /**待采集内容区域属性MAP*/   
  17. private Map<String, String> contentStartMap = new HashMap<String, String>();   
  18. /**待采集内容区域过滤属性MAP*/   
  19. private Map<String, String> contentEndMap = new HashMap<String, String>();   
  20.   
  21. public Map<String, String> getLinksetStartMap() {   
  22. return linksetStartMap;   
  23. }   
  24. public void setLinksetStartMap(Map<String, String> linksetStartMap) {   
  25. this.linksetStartMap = linksetStartMap;   
  26. }   
  27. public Map<String, String> getLinksetEndMap() {   
  28. return linksetEndMap;   
  29. }   
  30. public void setLinksetEndMap(Map<String, String> linksetEndMap) {   
  31. this.linksetEndMap = linksetEndMap;   
  32. }   
  33. public Map<String, String> getContentStartMap() {   
  34. return contentStartMap;   
  35. }   
  36. public void setContentStartMap(Map<String, String> contentStartMap) {   
  37. this.contentStartMap = contentStartMap;   
  38. }   
  39. public Map<String, String> getContentEndMap() {   
  40. return contentEndMap;   
  41. }   
  42. public void setContentEndMap(Map<String, String> contentEndMap) {   
  43. this.contentEndMap = contentEndMap;   
  44. }   
  45.   
  46.   
  47. }   

Java代码   收藏代码
  1. 队列 Queue.java   
  2. package com.jeecms.common.crawler;   
  3.   
  4. import java.util.LinkedList;   
  5. /**  
  6.  * 队列  
  7.  * @author javacoo  
  8.  * @since 2011-11-01  
  9.  * @param <T>  
  10.  */   
  11. public class Queue<T> {   
  12. private LinkedList<T> queue = new LinkedList<T>();   
  13. /**  
  14.  * 入队列  
  15.  * @param t  
  16.  */   
  17. public void enQueue(T t){   
  18. queue.addLast(t);   
  19. }   
  20. /**  
  21.  * 出队列  
  22.  * @return t  
  23.  */   
  24. public T deQueue(){   
  25. return queue.removeFirst();   
  26. }   
  27. /**  
  28.  * 判断队列是否为空  
  29.  * @return  
  30.  */   
  31. public boolean isEmpty(){   
  32. return queue.isEmpty();   
  33. }   
  34. /**  
  35.  * 判断队列是否含有t  
  36.  * @param t  
  37.  * @return  
  38.  */   
  39. public boolean contains(T t){   
  40. return queue.contains(t);   
  41. }   
  42. /**  
  43.  * 取得队列大小  
  44.  * @return  
  45.  */   
  46. public int getSize(){   
  47. return queue.size();   
  48. }   
  49.   
  50. }   

Java代码   收藏代码
  1. URL队列 UrlQueue.java   
  2. package com.jeecms.common.crawler;   
  3.   
  4. import java.util.HashSet;   
  5. import java.util.Map;   
  6. import java.util.Set;   
  7.   
  8. import org.springframework.util.CollectionUtils;   
  9.   
  10. /**  
  11.  * URL队列  
  12.  * @author javacoo  
  13.  * @since 2011-11-01  
  14.  * @param <Map<String, String>>  
  15.  */   
  16. public class UrlQueue {   
  17. /**已访问URL集合*/   
  18. private Set<Map<String, String>> visitedUrl = new HashSet<Map<String, String>>();   
  19. /**待访问URL集合*/   
  20. private Queue<Map<String, String>> unVisitedUrl = new Queue<Map<String, String>>();   
  21.   
  22. /**  
  23.  * 获得 URL 队列  
  24.  * @return  
  25.  */   
  26. public Queue<Map<String, String>> getUnVisitedUrl() {   
  27. return unVisitedUrl;   
  28. }   
  29. /**  
  30.  * 未访问的 URL 出队列  
  31.  * @return  
  32.  */   
  33. public Map<String, String> unVisitedUrlDeQueue() {   
  34. return unVisitedUrl.deQueue();   
  35. }   
  36. /**  
  37.  * 保证每个 URL 只被访问一次  
  38.  * @param url  
  39.  */   
  40. public void addUnVisitedUrl(Map<String, String> urlMap) {   
  41. if (!CollectionUtils.isEmpty(urlMap) && !unVisitedUrl.contains(urlMap) && !visitedUrl.contains(urlMap)){   
  42. unVisitedUrl.enQueue(urlMap);   
  43. }   
  44. }   
  45. /**  
  46.  * 判断是否为空  
  47.  * @return  
  48.  */   
  49. public boolean isEmpty(){   
  50. return unVisitedUrl.isEmpty();   
  51. }   
  52. /**  
  53.  * 未访问URL数量  
  54.  * @return  
  55.  */   
  56. public int getUnVisitedUrlNum(){   
  57. return unVisitedUrl.getSize();   
  58. }   
  59. /**  
  60.  * 添加到访问过的URL队列中  
  61.  * @param urlMap  
  62.  */   
  63. public void addVisitedUrl(Map<String, String> urlMap){   
  64. visitedUrl.add(urlMap);   
  65. }   
  66. /**  
  67.  * 删除访问过的URL  
  68.  * @param urlMap  
  69.  */   
  70. public void removeVisitedUrl(Map<String, String> urlMap){   
  71. visitedUrl.remove(urlMap);   
  72. }   
  73. /**  
  74.  * 已访问URL数量  
  75.  * @return  
  76.  */   
  77. public int getVisitedUrlNum(){   
  78. return visitedUrl.size();   
  79. }   
  80.   
  81. }   

Java代码   收藏代码
  1. 接下来是XML配置   
  2. ==============================定时任务模块XML配置====================================   
  3. dao配置   
  4. <bean id="cmsSchedulerDao" class="com.jeecms.cms.dao.assist.impl.CmsSchedulerDaoImpl"/>   
  5. manage配置   
  6. <bean id="cmsSchedulerMng" class="com.jeecms.cms.manager.assist.impl.CmsSchedulerMngImpl"/>   
  7. SERVICE配置   
  8. <bean id="schedulerAcquisitionSvc" class="com.jeecms.cms.service.scheduler.SchedulerAcquisitionSvcImpl"/>   
  9. <bean id="schedulerTaskManageSvc" class="com.jeecms.cms.service.scheduler.SchedulerTaskManageSvcImpl"/>   

Java代码   收藏代码
  1. 接下来是messages_zh_CN.properties 添加了常量   
  2. ==============================messages_zh_CN.properties====================================   
  3.   
  4. cmsScheduler.acquisition.function=\u91C7\u96C6\u4EFB\u52A1\u7BA1\u7406   
  5. cmsScheduler.name=\u4EFB\u52A1\u540D\u79F0   
  6. cmsScheduler.expression=\u8BA1\u5212\u8868\u8FBE\u5F0F   
  7. cmsScheduler.expression.help=\u53C2\u6570\u4EE5\u9017\u53F7\u5206\u9694,*\u53F7\u8868\u793A\u65E0\u503C,\u51716\u4F4D\:\u6BCF\u4E2A\u6708\u7684\u7B2C\u51E0\u5468,\u6BCF\u5468\u7684\u7B2C\u51E0\u5929,\u5929(\u51E0\u53F7),\u5C0F\u65F6(24\u5C0F\u65F6\u5236),\u5206\u949F,\u79D2\u3002\u5982\uFF1A1,6,4,15,20,30       \u8868\u793A \u4ECE\u4ECA\u5929\u768415\:20\:30\u5F00\u59CB\uFF0C\u6BCF\u9694\u4E00\u4E2A\u6708\u6267\u884C\u4E00\u6B21,\u5373\u4E0B\u6B21\u6267\u884C\u65F6\u95F4\u662F  \u4E0B\u4E2A\u6708\u7684\u7B2C\u4E00\u5468\u7684\u7B2C6\u5929\u768415\:20\:30   
  8. cmsScheduler.associate=\u5173\u8054\u4EFB\u52A1   
  9. cmsScheduler.status.0=\u505C\u6B62   
  10. cmsScheduler.status.1=\u8FD0\u884C   
  11. cmsScheduler.opt.start=\u5F00\u59CB   
  12. cmsScheduler.opt.end=\u505C\u6B62   
  13. cmsScheduler.status=\u72B6\u6001   
  14. cmsScheduler.startTime=\u5F00\u59CB\u65F6\u95F4   
  15. cmsScheduler.endTime=\u7ED3\u675F\u65F6\u95F4   
  16. cmsScheduler.log.delete=\u5220\u9664\u4EFB\u52A1   

Java代码   收藏代码
  1. ==============================模板====================================   
  2. scheduler/add.html   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  4. <html xmlns="http://www.w3.org/1999/xhtml">   
  5. <head>   
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>   
  7. <title></title>   
  8. <#include "/jeecms_sys/head.html"/>   
  9. <script type="text/javascript">   
  10. $.validator.methods.leafChannel = function(value, element, param) {   
  11. var i = element.selectedIndex;   
  12. return $(element.options[i]).attr("class")!="sel-disabled";   
  13. };   
  14. $(function() {   
  15. $("#jvForm").validate({   
  16. rules: {   
  17. channelId: {   
  18. required: true,   
  19. leafChannel: true   
  20. }   
  21. },   
  22. messages:{   
  23. channelId: {   
  24. leafChannel: "<@s.m "cmsAcquisition.error.notLeafChannel"/>"   
  25. }   
  26. }   
  27. });   
  28. });   
  29. </script>   
  30. <style type="text/css">   
  31. .sel-disabled{background-color:#ccc}   
  32. </style>   
  33. </head>   
  34. <body>   
  35. <div class="body-box">   
  36. <div class="rhead">   
  37. <div class="rpos"><@s.m "global.position"/>: <@s.m "cmsScheduler.acquisition.function"/> - <@s.m "global.add"/></div>   
  38. <form class="ropt">   
  39. <input type="hidden" name="moduleType" value="${moduleType!}" />   
  40. <input type="submit" value="<@s.m "global.backToList"/>" οnclick="this.form.action='v_listBy.do';"/>   
  41. </form>   
  42. <div class="clear"></div>   
  43. </div>   
  44. <@p.form id="jvForm" action="o_save.do" labelWidth="12">   
  45. <input type="hidden" name="moduleType" value="${moduleType!}" />   
  46. <@p.text colspan="1" width="50" label="cmsScheduler.name" name="name" required="true" class="required" maxlength="50"/>   
  47. <@p.td colspan="1" width="50" label="cmsScheduler.associate" required="true">   
  48. <@p.select list=schedulerTaskList name="associateId" listKey="id" listValue="name"/>   
  49. </@p.td><@p.tr/>   
  50. <@p.textarea colspan="2" label="cmsScheduler.expression" name="expression" help="cmsScheduler.expression.help" helpPosition="3" rows="1" cols="70" required="true" class="required" /><@p.tr/>   
  51. <@p.td colspan="2"><@p.submit code="global.submit"/> &nbsp; <@p.reset code="global.reset"/></@p.td>   
  52. </@p.form>   
  53. </div>   
  54. </body>   
  55. </html>   
  56. scheduler/edit.html   
  57. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  58. <html xmlns="http://www.w3.org/1999/xhtml">   
  59. <head>   
  60. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>   
  61. <title></title>   
  62. <#include "/jeecms_sys/head.html"/>   
  63. <script type="text/javascript">   
  64. $.validator.methods.leafChannel = function(value, element, param) {   
  65. var i = element.selectedIndex;   
  66. return $(element.options[i]).attr("class")!="sel-disabled";   
  67. };   
  68. $(function() {   
  69. $("#jvForm").validate({   
  70. rules: {   
  71. channelId: {   
  72. required: true,   
  73. leafChannel: true   
  74. }   
  75. },   
  76. messages:{   
  77. channelId: {   
  78. leafChannel: "<@s.m "cmsAcquisition.error.notLeafChannel"/>"   
  79. }   
  80. }   
  81. });   
  82. });   
  83. </script>   
  84. <style type="text/css">   
  85. .sel-disabled{background-color:#ccc}   
  86. </style>   
  87. </head>   
  88. <body>   
  89. <div class="body-box">   
  90. <div class="rhead">   
  91. <div class="rpos"><@s.m "global.position"/>:  <@s.m "cmsScheduler.acquisition.function"/> - <@s.m "global.edit"/></div>   
  92. <form class="ropt">   
  93. <input type="button" value="<@s.m "global.backToList"/>" οnclick="history.back();"/>   
  94. </form>   
  95. <div class="clear"></div>   
  96. </div>   
  97. <@p.form id="jvForm" action="o_update.do" labelWidth="12">   
  98. <input type="hidden" name="moduleType" value="${cmsScheduler.moduleType!}" />   
  99. <@p.text colspan="1" width="50" label="cmsScheduler.name" name="name" value=cmsScheduler.name required="true" class="required" maxlength="50"/>   
  100. <@p.td colspan="1" width="50" label="cmsScheduler.associate" required="true">   
  101. <@p.select list=schedulerTaskList name="associateId" value=cmsScheduler.associateId listKey="id" listValue="name"/>   
  102. </@p.td><@p.tr/>   
  103. <@p.textarea colspan="2" label="cmsScheduler.expression" name="expression" rows="1" help="cmsScheduler.expression.help" helpPosition="3" value=cmsScheduler.expression required="true" class="required" cols="70" /><@p.tr/>   
  104. <@p.td colspan="2">   
  105. <@p.hidden name="id" value=cmsScheduler.id/>   
  106. <@p.submit code="global.submit"/> &nbsp; <@p.reset code="global.reset"/>   
  107. </@p.td>   
  108. </@p.form>   
  109. </div>   
  110. </body>   
  111. </html>   
  112. scheduler/list.html   
  113. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  114. <html xmlns="http://www.w3.org/1999/xhtml">   
  115. <head>   
  116. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>   
  117. <title></title>   
  118. <#include "/jeecms_sys/head.html"/>   
  119. <script type="text/javascript">   
  120. function getTableForm() {   
  121. return document.getElementById('tableForm');   
  122. }   
  123. function optDelete() {   
  124. if(Pn.checkedCount('ids')<=0) {   
  125. alert("<@s.m 'error.checkRecord'/>");   
  126. return;   
  127. }   
  128. if(!confirm("<@s.m 'global.confirm.delete'/>")) {   
  129. return;   
  130. }   
  131. var f = getTableForm();   
  132. f.action="o_delete.do";   
  133. f.submit();   
  134. }   
  135. </script>   
  136. </head>   
  137. <body>   
  138. <div class="body-box">   
  139. <div class="rhead">   
  140. <div class="rpos"><@s.m "global.position"/>: <@s.m "cmsScheduler.acquisition.function"/> - <@s.m "global.list"/></div>   
  141. <form class="ropt">   
  142. <input type="hidden" name="moduleType" value="${moduleType!}" />   
  143. <input type="submit" value="<@s.m "global.add"/>" οnclick="this.form.action='v_add.do';"/>   
  144. </form>   
  145. <div class="clear"></div>   
  146. </div>   
  147. <form id="tableForm" method="post">   
  148. <input type="hidden" name="pageNo" value="${pageNo!}"/>   
  149. <@p.table value=list;cmsScheduler,i,has_next><#rt/>   
  150. <@p.column title="<input type='checkbox' οnclick='Pn.checkbox(\"ids\",this.checked)'/>" width="20">   
  151. <input type='checkbox' name='ids' value='${cmsScheduler.id}'/><#t/>   
  152. </@p.column><#t/>   
  153. <@p.column title="ID">${cmsScheduler.id}</@p.column><#t/>   
  154. <@p.column code="cmsScheduler.name">${cmsScheduler.name}</@p.column><#t/>   
  155. <@p.column code="cmsScheduler.status" align="center"><#if cmsScheduler.status==1><strong style="color:red"></#if><@s.m "cmsScheduler.status."+cmsScheduler.status/><#if cmsScheduler.status==1></strong></#if></@p.column><#t/>   
  156. <@p.column code="cmsScheduler.startTime" align="center">${(cmsScheduler.startTime?string('yyyy-MM-dd HH:mm:ss'))!}</@p.column><#t/>   
  157. <@p.column code="cmsScheduler.endTime" align="center">${(cmsScheduler.endTime?string('yyyy-MM-dd HH:mm:ss'))!}</@p.column><#t/>   
  158. <@p.column code="global.operate" align="center">   
  159. <#if cmsScheduler.status==0>   
  160. <a href="o_start.do?id=${cmsScheduler.id}" class="pn-opt"><@s.m "cmsScheduler.opt.start"/></a> | <#rt/>   
  161. <#else>   
  162. <@s.m "cmsScheduler.opt.start"/> | <#rt/>   
  163. </#if>   
  164. <#if cmsScheduler.status==1 || cmsScheduler.status==1>   
  165. <a href="o_end.do?id=${cmsScheduler.id}" class="pn-opt"><@s.m "cmsScheduler.opt.end"/></a> | <#rt/>   
  166. <#else>   
  167. <@s.m "cmsScheduler.opt.end"/> | <#rt/>   
  168. </#if>   
  169. <a href="v_edit.do?id=${cmsScheduler.id}" class="pn-opt"><@s.m "global.edit"/></a> | <#rt/>   
  170. <a href="o_delete.do?ids=${cmsScheduler.id}&moduleType=${cmsScheduler.moduleType}" class="pn-opt" οnclick="if(!confirm('<@s.m "global.confirm.delete"/>')) {return false;}"><@s.m "global.delete"/></a><#t/>   
  171. </@p.column><#t/>   
  172. </@p.table>   
  173. <div><input type="button" value="<@s.m "global.delete"/>" οnclick="optDelete();"/></div>   
  174. </form>   
  175. </div>   
  176. <#include "/common/alert_message.html"/>   
  177. </body>   
  178. </html>   

Java代码   收藏代码
  1. generate_left.html 有修改   
  2. 加上   
  3. <@cms_perm url="/scheduler/v_listBy.do">   
  4. <li><a href="../scheduler/v_listBy.do?moduleType=schedulerAcquisitionSvc" target="rightFrame"><@s.m "cmsScheduler.acquisition.function"/></a></li>   
  5. </@cms_perm>   

转自:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值