Quartz的持久化数据库(九)下

简介: Quartz的持久化数据库(九)下

五. Quartz 持久化的扩展

将 JobDetail,Trigger 存储到数据库里面,就可以完成持久化, 在项目运行的过程中,如果将合法的数据,


插入到对应的数据库表里面,是否就可以创建任务呢, 作一个任务管理系统的模块呢? 是可以的。


Quartz 支持动态的添加任务。


五.一 编写动态任务 MyJob2

package com.yjl.job;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class MyJob2 extends QuartzJobBean implements Serializable{
  private static final long serialVersionUID = 1L;
  @Override
  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("动态任务,备份数据库的时间是:"+dateString); 
  }
}


类完整路径为: com.yjl.job.MyJob2


五.二 构建JobAndTrigge 的实体Bean JobAndTrigger


创建一个 JobAndTrigger的Bean, 里面封装一些 Job和Trigger的对象信息, 这些对象信息是前端传递过来的。

package com.yjl.trigger;
import java.io.Serializable;
/**
 * 
 * @author 两个蝴蝶飞
 *
 *用于接收 配置任务和触发器的信息
 */
public class JobAndTrigger implements Serializable{
  private static final long serialVersionUID = 1L;
  /**
  * @param jobName 任务名称
  * @param jobGroupName 任务组的名称
  * @param jobClassName 任务的名称
  * @param triggerName 触发器名称
  * @param triggerGroupName 触发器组名称
  * @param cronExpression cron表达式
  * @param repeatInterval 间隔
  * @param repeatCount 次数
  * @param startDelay 延迟开始时间
  */
  private String jobName;
  private String jobGroupName;
  private String jobClassName;
  private String triggerName;
  private String triggerGroupName;
  private String cronExpression;
  private Long repeatInterval;
  private Integer repeatCount;
  private Long startDelay;
  public String getJobName() {
  return jobName;
  }
  public void setJobName(String jobName) {
  this.jobName = jobName;
  }
  public String getJobGroupName() {
  return jobGroupName;
  }
  public void setJobGroupName(String jobGroupName) {
  this.jobGroupName = jobGroupName;
  }
  public String getJobClassName() {
  return jobClassName;
  }
  public void setJobClassName(String jobClassName) {
  this.jobClassName = jobClassName;
  }
  public String getTriggerName() {
  return triggerName;
  }
  public void setTriggerName(String triggerName) {
  this.triggerName = triggerName;
  }
  public String getTriggerGroupName() {
  return triggerGroupName;
  }
  public void setTriggerGroupName(String triggerGroupName) {
  this.triggerGroupName = triggerGroupName;
  }
  public String getCronExpression() {
  return cronExpression;
  }
  public void setCronExpression(String cronExpression) {
  this.cronExpression = cronExpression;
  }
  public Long getRepeatInterval() {
  return repeatInterval;
  }
  public void setRepeatInterval(Long repeatInterval) {
  this.repeatInterval = repeatInterval;
  }
  public Integer getRepeatCount() {
  return repeatCount;
  }
  public void setRepeatCount(Integer repeatCount) {
  this.repeatCount = repeatCount;
  }
  public Long getStartDelay() {
  return startDelay;
  }
  public void setStartDelay(Long startDelay) {
  this.startDelay = startDelay;
  }
  @Override
  public String toString() {
  return "JobAndTrigger [jobName=" + jobName + ", jobGroupName=" + jobGroupName + ", jobClassName=" + jobClassName
    + ", triggerName=" + triggerName + ", triggerGroupName=" + triggerGroupName + ", cronExpression="
    + cronExpression + ", repeatInterval=" + repeatInterval + ", repeatCount=" + repeatCount
    + ", startDelay=" + startDelay + "]";
  }
}

五.三 编写 Action QuartzAction

/**
 * 
 * @author 两个蝴蝶飞
 * 
 * 任务管理的控制器
 *
 */
@Controller
@RequestMapping("/Quartz")
public class QuartzAction {
  //Scheduler 是注入的
  @Autowired
  private Scheduler scheduler;
  //查看列表
  @RequestMapping("/list")
  @ResponseBody
  public Map<String,Object> list(){
  Map<String,Object> map=new HashMap<String,Object>();
  map.put("data",null);
  return map;
  }
  //只演示一下添加操作
  @RequestMapping("/add")
  @ResponseBody
  public Map<String,Object> add(JobAndTrigger jobAndTrigger) throws Exception{
  Map<String,Object> map=new HashMap<String,Object>();
  //创建JobDetail 
  JobDetail jobDetail=JobBuilder
  .newJob((Class<? extends Job>) Class.forName(jobAndTrigger.getJobClassName()))
  .withIdentity(jobAndTrigger.getJobName(),jobAndTrigger.getJobGroupName())
  .storeDurably(true)
  .build();
  //创建Trigger 
  Trigger trigger=TriggerBuilder.newTrigger()
    .withIdentity(jobAndTrigger.getTriggerName(),jobAndTrigger.getTriggerGroupName())
    .withSchedule(CronScheduleBuilder.cronSchedule(jobAndTrigger.getCronExpression()))
    .build();
  //关联起来
  scheduler.scheduleJob(jobDetail, trigger);
  map.put("response_status",true);
  return map;
  }
}


五.四 applicationContext-job.xml 配置


与 四.三 移除后的配置一致, 不重复复制了。


五.五 编写前端页面 index.jsp

直接放置到 index.jsp 页面里面了, 引入 bootstrap 来美化样式。


构建一个简单的 Cron 触发器。

<body>
  <div class="col-sm-6 col-sm-offset-3">
  <div class="col-sm-offset-2" style="color:#D33;margin-top:30px;">
    <h2>两个蝴蝶飞 定时任务添加</h2>
  </div>
  <div style="margin-top:40px;">
    <form action="${pageContext.request.contextPath}/Quartz/add" method="post" 
    class="form-horizontal" role="form">
    <div class="form-group">
        <label class="col-md-2 control-label">任务名称:</label>
        <div class="col-md-4">
        <input type="text" class="form-control"
          name="jobName" value=""/>
        </div>
    </div>
    <div class="form-group">
        <label   class="col-md-2 control-label">任务组名称:</label>
        <div class="col-md-4">
        <input type="text" class="form-control"
          name="jobGroupName" value=""/>
        </div>
    </div>
    <div class="form-group">
        <label   class="col-md-2 control-label">任务类路径:</label>
        <div class="col-md-4">
        <input type="text" class="form-control"
          name="jobClassName" value=""/>
        </div>
    </div>
    <div class="form-group">
        <label   class="col-md-2 control-label">触发器名称:</label>
        <div class="col-md-4">
        <input type="text" class="form-control"
          name="triggerName" value=""/>
        </div>
    </div>
    <div class="form-group">
        <label   class="col-md-2 control-label">触发器组名称:</label>
        <div class="col-md-4">
        <input type="text" class="form-control"
          name="triggerGroupName" value=""/>
        </div>
    </div>
    <div class="form-group">
        <label   class="col-md-2 control-label">cron表达式:</label>
        <div class="col-md-4">
        <input type="text" class="form-control"
          name="cronExpression" value=""/>
        </div>
    </div>
    <div class="form-group">
      <div class="col-sm-offset-3">
      <input type="submit" value="添加任务" class="btn btn-success"/>
      </div>
    </div>
    </form>
  </div>
  </div>
</body>


五.六 重启服务器验证

输入网址: http://localhost:8080/Quartz_Persistence


image.png


填写相应的信息:


image.png


在点击之前,看一下控制台的任务执行:


image.png


全部都是 Spring 的。


点击 添加任务按钮,


查看一下控制台:


image.png


页面跳转

image.png



数据库信息 qrtz_cron_triggers 内容查看


image.png


关闭服务器后,重新开启

image.png


可以动态地进行添加任务,当然,也可以进行移除任务,挂起任务,修改任务的触发cron表达等。


老蝴蝶这儿就不做过多的讲解了。

相关文章
|
1月前
|
SQL 开发框架 JavaScript
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
57 3
|
1月前
|
监控 NoSQL Java
Redis数据库 | 事务、持久化
Redis数据库 | 事务、持久化
33 0
|
1月前
|
NoSQL 安全 Unix
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(中)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
25 0
|
1月前
|
存储 NoSQL 调度
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(下)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
20 0
|
1月前
|
存储 NoSQL API
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(上)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
28 1
|
1月前
|
SQL Java 数据库连接
使用Hibernate进行数据库持久化操作
【4月更文挑战第15天】Hibernate 是一款开源 ORM 框架,简化数据库操作,通过映射将 Java 对象与表交互。核心接口包括 SessionFactory、Session、Transaction、Query 和 Criteria。使用 Hibernate 需添加依赖,配置 hibernate.cfg.xml 文件,设置数据库信息,并创建实体类及映射文件。
|
1月前
|
JavaScript 前端开发 API
如何在 Vue 中进行数据持久化(例如与后端数据库交互)?
如何在 Vue 中进行数据持久化(例如与后端数据库交互)?
48 3
|
3天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!
|
2天前
|
SQL 存储 关系型数据库
深入理解MySQL:数据库管理与性能优化
第一章:MySQL基础 MySQL概述:简要介绍MySQL的历史、特点和应用领域
|
2天前
|
SQL 关系型数据库 MySQL
精通MySQL:从数据库管理到性能优化
第一章:MySQL入门 MySQL简介:了解MySQL的起源、发展历程以及在Web开发中的重要性

热门文章

最新文章