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 中进行数据持久化时,有哪些常用的数据库框架?
49 3
|
4月前
|
监控 NoSQL Java
Redis数据库 | 事务、持久化
Redis数据库 | 事务、持久化
28 0
|
存储 Java 调度
Springboot集成Quartz(任务存储在数据库)
集成quartz实现定时调度,quartz是一个功能丰富的开源的任务调用系统,它可以定义很多job并发执行,支持事务和集群
944 0
|
1月前
|
JavaScript 前端开发 API
如何在 Vue 中进行数据持久化(例如与后端数据库交互)?
如何在 Vue 中进行数据持久化(例如与后端数据库交互)?
27 3
|
6月前
|
SQL Java 数据库
[笔记]Springboot入门《三》springboot集成Quartz简单使用+数据库
[笔记]Springboot入门《三》springboot集成Quartz简单使用+数据库
|
8月前
|
存储 Java 关系型数据库
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作,上一篇文章使用Quartz创建定时任务都是保存在内存中,如果服务重启定时任务就会失效,所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能,本文主要实现这种Quartz的这种使用方式。
434 0
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
|
11月前
|
缓存 NoSQL Java
高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库
高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库
338 0
|
11月前
|
存储 人工智能 数据库
App Inventor 2 本地存储之“微数据库”组件,App数据持久化
数据存储一般分为两大类:本地 和 网络,本地一般是数据文件的形式存储在手机上,本地App每次启动都可以共享读取,但是不同的手机之间不可以共享数据;如果需要多个手机之间共享获取或存储数据的话,那就需要用到网络数据库了(云数据库、网络微数据库,它们目前默认都是MIT服务器),它的原理就是用户A将数据通过网络传输到云服务器,然后用户B通过网络可以读取到用户A存储的数据,最典型的应用就是类似微信的聊天App了。 本地数据库一般指的就是“微数据库”,提供键、值方式的存储。
337 0
|
7天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
37 2
|
22天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
105 0

热门文章

最新文章