- 浏览: 66411 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (87)
- hibernate (5)
- maven (2)
- svn (2)
- 线程安全 (1)
- hibernate4 (1)
- spring3 (6)
- struts2 (1)
- mysql (1)
- junit (1)
- mail (1)
- java (2)
- smslib (1)
- quartz (2)
- eclipse (1)
- jdeclipse (1)
- dhtmlxtree (1)
- linux (1)
- chrome (1)
- SenchaArchitect2 (1)
- Ext Desiger (0)
- Ext Designer (1)
- tomcat request service (0)
- tomcat (1)
- request (1)
- service (1)
- ParameterMap (1)
最新评论
-
dengfengfeng:
[flash=200,200][url][img][list] ...
ehcache 与spring相结合超时自动刷新缓存的框架搭建 -
wangshiyang:
pyzheng 写道大哥 ,你有针对Hibernate4的os ...
hibernate4,spring3,struts2整合中解决 -
pyzheng:
大哥 ,你有针对Hibernate4的oscache配置么? ...
hibernate4,spring3,struts2整合中解决 -
wangshiyang:
wslovenide 写道你说的这个我也遇到了,就是最后一点我 ...
hibernate4,spring3,struts2整合中解决 -
wslovenide:
你说的这个我也遇到了,就是最后一点我有点怀疑,sessionF ...
hibernate4,spring3,struts2整合中解决
注意:只适用于quartz1.8版本以下的,1.8版本以上的因为spring需要等等3.2M2版本才能修复
结合spring+quartz开发个后台的WEB管理系统,系统主要包括以下功能:
1、动态添加、修改和删除数据源,并加入到spring管理。
2、动态注册、修改和删除任务(需要实现的具体quartz业务类),并加入到quartz管理。
3、提供上传第三方包的功能。(主要考虑实现的业务类,需要引入其他的jar包)。
4、在线日志查询分析。
。。。
后台系统的应用领域:
1、执行多个数据库之间的数据交换服务。
2、架设系统与银行之间的通讯服务。
。。。
以前没搞过这方面应用,比较头疼,经过google、百度,初步方案实现如下:
1、实现个servlet用于启动quartz调度。
程序如下:
Java代码
2、到xml文件查询前台添加的任务队列,加入quartz管理并执行。
Java代码
3、封装SchedulerService实现quartz调度的方法
封装的出来quartz的接口:
Java代码
实现类:
Java代码
4、覆盖QuartzJobBean的executeInternal方法,根据“name”名实现任务的动态分配
Java代码
5、quartz的配置文件:
Java代码
以上是实现的主要代码: 目前可以实现任务的动态添加并执行,现在的问题是添加多个任务时,最后面的任务会覆盖之前所有的任务。
结合spring+quartz开发个后台的WEB管理系统,系统主要包括以下功能:
1、动态添加、修改和删除数据源,并加入到spring管理。
2、动态注册、修改和删除任务(需要实现的具体quartz业务类),并加入到quartz管理。
3、提供上传第三方包的功能。(主要考虑实现的业务类,需要引入其他的jar包)。
4、在线日志查询分析。
。。。
后台系统的应用领域:
1、执行多个数据库之间的数据交换服务。
2、架设系统与银行之间的通讯服务。
。。。
以前没搞过这方面应用,比较头疼,经过google、百度,初步方案实现如下:
1、实现个servlet用于启动quartz调度。
程序如下:
Java代码
public class DispatchJobServlet extends HttpServlet { private static final long serialVersionUID = -3920177706344758439L; private ApplicationContext ctx; public DispatchJobServlet() { super(); // 初始化自定义类加载器,主要用于加载第三方包和服务程序。 ServiceStartup manguage = new ServiceStartup(); manguage.startUp(); } /** * 初始化 */ public void init(ServletConfig config) throws ServletException { super.init(config); ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(config.getServletContext()); StartJobService taskStartService = (StartJobService) ctx.getBean("startJobService"); //启用个线程开始任务调度 ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(taskStartService); }
2、到xml文件查询前台添加的任务队列,加入quartz管理并执行。
Java代码
@Service public class StartJobService implements Runnable { /** * log4j 记录器 */ private static final Logger log = Logger.getLogger(StartJobService.class); @Resource private SchedulerService schedulerService; public void run() { try { while (true) { List<JobBo> list = DomParser.findAllJobXml("db.service.xml"); Iterator<JobBo> i = list.iterator(); while (i.hasNext()) { JobBo job = i.next(); // 如果任务队列不存在则注册并运行 if (!ServiceManager.queryExistsJob(job.getName())) { try { schedulerService.schedule(job); ServiceManager.getJobHolder().put(job.getName(), job); } catch (Exception e) { log.error("服务【" + job.getName() + "】启动失败!", e); throw new SummerException("服务【" + job.getName() + "】启动失败!"); } } Thread.sleep(3000); } } } catch (SummerException e) { throw e; } catch (Exception e) { log.error("调度任务出现异常!", e); } } }
3、封装SchedulerService实现quartz调度的方法
封装的出来quartz的接口:
Java代码
public interface SchedulerService { /** * 自定义任务对象并启动任务 * * @param job * 任务队列业务对象 */ void schedule(JobBo job); /** * 取得所有调度Triggers * * @return */ List<Map<String, Object>> getQrtzTriggers(); /** * 根据名称和组别暂停Tigger * * @param triggerName * @param group */ void pauseTrigger(String triggerName, String group); /** * 恢复Trigger * * @param triggerName * @param group */ void resumeTrigger(String triggerName, String group); /** * 删除Trigger * * @param triggerName * @param group */ boolean removeTrigdger(String triggerName, String group); }
实现类:
Java代码
public class SchedulerServiceImpl implements SchedulerService { private static final Logger log = LoggerFactory .getLogger(SchedulerServiceImpl.class); private Scheduler scheduler; private JobDetail jobDetail; public void setScheduler(Scheduler scheduler) { this.scheduler = scheduler; } public void setJobDetail(JobDetail jobDetail) { this.jobDetail = jobDetail; } /** * 自定义任务对象并启动任务 */ public void schedule(JobBo job) { // trigger分类 String category = job.getCategory(); try { if ("cron".equals(category)) { scheduleCron(job); } else { scheduleSimple(job); } } catch (Exception e) { log.error("任务调度过程中出现异常!"); throw new SummerException(e); } } /** * simple任务触发 * * @param job */ private void scheduleSimple(JobBo job) { String name = getTriggerName(job.getName()); // 实例化SimpleTrigger SimpleTrigger simpleTrigger = new SimpleTrigger(); // 这些值的设置也可以从外面传入,这里采用默放值 simpleTrigger.setJobName(jobDetail.getName()); simpleTrigger.setJobGroup(Scheduler.DEFAULT_GROUP); simpleTrigger.setRepeatInterval(1000L); // 设置名称 simpleTrigger.setName(name); // 设置Trigger分组 String group = job.getGroup(); if (StringUtils.isEmpty(group)) { group = Scheduler.DEFAULT_GROUP; } simpleTrigger.setGroup(group); // 设置开始时间 Timestamp startTime = job.getStartTime(); if (null != startTime) { simpleTrigger.setStartTime(new Date()); } // 设置结束时间 Timestamp endTime = job.getEndTime(); if (null != endTime) { simpleTrigger.setEndTime(endTime); } // 设置执行次数 int repeatCount = job.getRepeatCount(); if (repeatCount > 0) { simpleTrigger.setRepeatCount(repeatCount); } // 设置执行时间间隔 long repeatInterval = job.getRepeatInterval(); if (repeatInterval > 0) { simpleTrigger.setRepeatInterval(repeatInterval * 1000); } try { JobDataMap jobData = new JobDataMap(); jobData.put("name", job.getName()); jobData.put("desc", job.getDesc()); jobDetail.setJobDataMap(jobData); scheduler.addJob(jobDetail, true); scheduler.scheduleJob(simpleTrigger); scheduler.rescheduleJob(simpleTrigger.getName(), simpleTrigger .getGroup(), simpleTrigger); } catch (SchedulerException e) { log.error("任务调度出现异常!"); log.error(LogGenerator.getInstance().generate(e)); throw new SummerException("任务调度出现异常!"); } } /** * cron任务触发 * * @param job */ private void scheduleCron(JobBo job) { String name = getTriggerName(job.getName()); try { JobDataMap jobData = new JobDataMap(); jobData.put("name", job.getName()); jobData.put("desc", job.getDesc()); jobDetail.setJobDataMap(jobData); scheduler.addJob(jobDetail, true); CronTrigger cronTrigger = new CronTrigger(name, job.getGroup(), jobDetail.getName(), Scheduler.DEFAULT_GROUP); cronTrigger.setCronExpression(job.getCronExpression()); scheduler.scheduleJob(cronTrigger); scheduler.rescheduleJob(cronTrigger.getName(), cronTrigger .getGroup(), cronTrigger); } catch (Exception e) { log.error("执行cron触发器出现异常!", e); throw new SummerException("执行cron触发器出现异常!"); } } public void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval, String group) { if (name == null || name.trim().equals("")) { name = UUID.randomUUID().toString(); } else { // 在名称后添加UUID,保证名称的唯一性 name += "&" + UUID.randomUUID().toString(); } try { scheduler.addJob(jobDetail, true); SimpleTrigger SimpleTrigger = new SimpleTrigger(name, group, jobDetail.getName(), Scheduler.DEFAULT_GROUP, startTime, endTime, repeatCount, repeatInterval); scheduler.scheduleJob(SimpleTrigger); scheduler.rescheduleJob(SimpleTrigger.getName(), SimpleTrigger .getGroup(), SimpleTrigger); } catch (SchedulerException e) { throw new RuntimeException(e); } } public void pauseTrigger(String triggerName, String group) { try { scheduler.pauseTrigger(triggerName, group);// 停止触发器 } catch (SchedulerException e) { throw new SummerException(e); } } public void resumeTrigger(String triggerName, String group) { try { scheduler.resumeTrigger(triggerName, group);// 重启触发器 } catch (SchedulerException e) { log.error("重启触发器失败!"); throw new SummerException(e); } } public boolean removeTrigdger(String triggerName, String group) { try { scheduler.pauseTrigger(triggerName, group);// 停止触发器 return scheduler.unscheduleJob(triggerName, group);// 移除触发器 } catch (SchedulerException e) { throw new SummerException(e); } } private Timestamp parseDate(String time) { try { return Timestamp.valueOf(time); } catch (Exception e) { log.error("日期格式错误{},正确格式为:yyyy-MM-dd HH:mm:ss", time); throw new SummerException(e); } } public List<Map<String, Object>> getQrtzTriggers() { // TODO Auto-generated method stub return null; } /** * 获取trigger名称 * * @param name * @return */ private String getTriggerName(String name) { if (StringUtils.isBlank(StringUtils.trim(name))) { name = UUID.randomUUID().toString(); } else { name = name.substring(name.lastIndexOf(".") + 1); // 在名称后添加UUID,保证名称的唯一性 name += "&" + UUID.randomUUID().toString(); } return StringUtils.trim(name); } }
4、覆盖QuartzJobBean的executeInternal方法,根据“name”名实现任务的动态分配
Java代码
public class EnhanceQuartzJobBean extends QuartzJobBean { /** * log4j 记录器 */ private static final Logger log = Logger .getLogger(EnhanceQuartzJobBean.class); @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { try { JobDetail t = context.getJobDetail(); JobDataMap map = t.getJobDataMap(); String name = map.getString("name"); String desc = map.getString("desc"); ServiceStartupManguage manguage = new ServiceStartupManguage(); manguage.runService(name, desc); } catch (Exception e) { log.error("执行任务出现异常", e); } } public class ServiceStartup { /** * log4j 记录器 */ private static final Logger log = Logger .getLogger(ServiceStartupManguage.class); public void startUp() { // 启动动态重新加载类的服务 StringBuilder sb = new StringBuilder(1024); sb.append(ServiceManager.getHome() + "work"); String jarPath = ServiceManager.getHome() + "ext"; // 遍历ext文件夹,寻找jar文件 File dir = new File(jarPath); String[] subFiles = dir.list(); for (int i = 0; i < subFiles.length; i++) { File file = new File(jarPath + System.getProperty("file.separator") + subFiles[i]); if (file.isFile() && subFiles[i].endsWith("jar")) { sb.append(File.pathSeparator + jarPath + System.getProperty("file.separator") + subFiles[i]); } } ServiceManager.checker = new ClassModifyChecker(ServiceManager.getHome()); ServiceManager.loader = new ServiceClassLoad(DispatchJobServlet.class .getClassLoader(), (String) sb.toString(), ServiceManager.checker); ServiceManager.classPath = sb.toString(); } /** * 启动后台服务 * * @author 任鹤峰 2009-02-03 * @param name * @param desc * @throws ClassNotFoundException * @throws NoSuchMethodException * @throws InstantiationException * @throws IllegalAccessException * @throws InvocationTargetException */ @SuppressWarnings("unchecked") public void runService(String name, String desc) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { try { Object service; Class cls = null; if (null != ServiceManager.loader) { cls = ServiceManager.getLoader().loadClass(name); } else { cls = Class.forName(name); } Class[] par = null; Object[] obj = null; par = new Class[2]; par[0] = String.class; par[1] = String.class; obj = new Object[2]; obj[0] = name; obj[1] = desc; Constructor ct = cls.getConstructor(par); service = ct.newInstance(obj); Method meth = cls.getMethod("start"); meth.invoke(service); cls = null; } catch (Exception e) { log.error("运行注册服务【" + name + "】出现异常", e); } } } }
5、quartz的配置文件:
Java代码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="schedulerFactory" singleton="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="applicationContextSchedulerContextKey" value="applicationContextKey" /> <property name="configLocation" value="classpath:quartz.properties" /> </bean> <bean id="jobDetail" singleton="false" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value> com.xeranx.summer.scheduling.EnhanceQuartzJobBean </value> </property> </bean> <bean id="schedulerService" singleton="false" class="com.xeranx.summer.scheduling.service.SchedulerServiceImpl"> <property name="jobDetail"> <ref bean="jobDetail" /> </property> <property name="scheduler"> <ref bean="schedulerFactory" /> </property> </bean> </beans>
以上是实现的主要代码: 目前可以实现任务的动态添加并执行,现在的问题是添加多个任务时,最后面的任务会覆盖之前所有的任务。
发表评论
-
spring和quartz2的配置
2013-05-14 18:14 1400spring quartz2 <?xml version ... -
hibernate could not initialize proxy - no Session
2013-01-25 15:42 1544could not initialize proxy - n ... -
spring mail的使用
2012-08-08 15:02 1113因为项目的要求,所以做了个邮件发送的功能,但是使用javaMa ... -
关于spring3集成hibernate进行junit测试的错误总结
2012-08-06 18:04 1015今天对框架功能进行整合,用的是spring2.5的框架,本来想 ... -
hibernate4,spring3,struts2整合中解决
2012-05-13 17:59 3395这两天闲着无聊就改动以前自己写的项目,以前的项目是s2sh3 ...
相关推荐
spring+springMVC+mybatis+quartz动态定时任务
上一次传错了资源了,这个是正确的,包含quartz动态定时任务的
利用quartz动态操作定时任务,所有配置信息扔到数据库合理管理,同时把运行日志自动添加数据库表中。
传统Spring+Quartz实现的定时器一般都是通过配置文件中配置的,这就意味着如果我们修改了定时任务的时间,就得重新启动一下Tomcat,而且每次新建一个任务就得在spring中添加相关的配置信息,非常麻烦。基于上面的...
动态管理了定时任务的添加、修改、删除等操作,可扩展性强
通过spring mvc整合qutarz , 结合数据库实现动态添加定时任务,管理定时任务等操作。
项目技术(必填): springboot2+spring+spring mvc+mybatis+quartz+vue 数据库文件: 见项目"建表语句.txt"文件 在添加新的任务的时候,填写任务名称时一定要把这个Job类的完整路径输入进来,对于Cron表达式,可以去...
Quartz1.7 动态添加、修改和删除定时任务(非spring集成版)
springquartz动态任务添加删除等功能
spring+quartz配置的定时器 可以动态添加任务
Springboot整合Quartz实现定时任务数据库动态配置,新增任务、修改cron表达式、暂停任务、恢复任务、删除任务等操作
java spring quartz 实现的动态定时任务,可以动态添加高度任务
SpringBoot整合Quartz实现动态定时任务,在页面动态展示,添加,暂停,删除定时任务. 并整合了MyBatis-plus, 感兴趣的小伙伴 可以试试
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、...并且还能和Spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,很好很强大!
任务调度,动态修改执行时间,添加,删除,修改任务。
Spring普通定时任务和动态设置定时任务.本资源仅供Spring有关的框架学习使用
基于springboot的任务调度技术quartz简单的实现demo,根目录有数据表,需要配置到您自己的数据库中,之后点击运行即可,比较有趣的是其中会用到一些反射知识,还有难点就是要在调度任务执行的类上@service添加类的...
SpringBoot集成Quartz定时任务(包含对任务的添加、暂停、删除、继续等)
除了使用Spring Boot提供的任务管理功能外,可以使用第三方库Quartz来处理更复杂的任务调度需求。Quartz提供了更多的调度策略、任务监听器等功能。 以上是一些在Spring Boot中实现任务管理的常见方案。你可以根据...
基于quartz集群分布式动态定时任务管理 真正动态,定时任务“0”开发,基于quartz集群超轻量级扩展实现。 不多说,先看效果 添加定时任务 编辑定时任务-修改定时规则 特点: 基于quartz集群,轻量扩展。可快速改造...