有关于定时任务,是之前公司项目有一个定时任务需求,比如周末公司休息,但是公司网站的文章需要提前存入数据库,然后周六凌晨或者自定义一个时间发布出去;所以研究了一下然后做出来了,下面是我做的流程
一、我引进的jar包
1、log4j-1.2.17
2、quartz-2.2.1.jar
3、quartz-jobs-2.2.1.jar
3、slf4j-api-1.7.12.jar
4、slf4j-log4j12-1.7.12.jar
二、流程和逻辑思路
数据库新增一张表定时任务的表
注释:表里面关键的是executetime(执行时间),articleid(文章编号)
文章表存入的close字段的状态为1,前端不会展示
将需要定时执行的任务都存入该表,并且任务的执行状态为1
1: 配置文件的修改,在spring-context.xml中加入以下代码
2:配置定时任务的bean
public class QuartzScheduleJob implements Serializable{
/** serialVersionUID*/
private static final long serialVersionUID = -929195342689371565L;
public static final String STATUS_RUNNING = "1";
public static final String STATUS_NOT_RUNNING = "0";
public static final String CONCURRENT_IS = "1";
public static final String CONCURRENT_NOT = "0";
private Long id;
private Date createtime;
private Date updatetime;
/**
* 任务名称
*/
private String jobname;
/**
* 任务分组
*/
private String jobgroup;
/**
* 任务状态 是否启动任务
*/
private String jobstatus;
/**
* 任务执行时间
*/
private Date executetime;
/**
* 描述
*/
private String description;
/**
* 任务执行时调用哪个类的方法 包名+类名
*/
private String beanclass;
/**
* 任务是否有状态
*/
private String isconcurrent;
/**
* spring bean
*/
private String springid;
/**
* 任务调用的方法名
*/
private String methodname;
private Long articleid;//需要定时发送的文章id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public Date getUpdatetime() {
return updatetime;
}
public void setUpdatetime(Date updatetime) {
this.updatetime = updatetime;
}
public String getJobname() {
return jobname;
}
public void setJobname(String jobname) {
this.jobname = jobname;
}
public String getJobgroup() {
return jobgroup;
}
public void setJobgroup(String jobgroup) {
this.jobgroup = jobgroup;
}
public String getJobstatus() {
return jobstatus;
}
public void setJobstatus(String jobstatus) {
this.jobstatus = jobstatus;
}
public Date getExecutetime() {
return executetime;
}
public void setExecutetime(Date executetime) {
this.executetime = executetime;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getBeanclass() {
return beanclass;
}
public void setBeanclass(String beanclass) {
this.beanclass = beanclass;
}
public String getIsconcurrent() {
return isconcurrent;
}
public void setIsconcurrent(String isconcurrent) {
this.isconcurrent = isconcurrent;
}
public String getSpringid() {
return springid;
}
public void setSpringid(String springid) {
this.springid = springid;
}
public String getMethodname() {
return methodname;
}
public void setMethodname(String methodname) {
this.methodname = methodname;
}
public Long getArticleid() {
return articleid;
}
public void setArticleid(Long articleid) {
this.articleid = articleid;
}
} 3:dao层
public interface QuartzScheduleJobMapper {
/**
* 保存定时任务信息
*
* @param quartzScheduleJob
* @return
*/
public Long saveEntity(QuartzScheduleJob quartzScheduleJob);
/**
* 查询所有任务
*
* @return
*/
public List findEntity();
/**
* 根据id删除数据
*
* @param jobId
* @return
*/
public int deleteByPrimaryKey(Long jobId);
/**
* 根据编号查询数据
*
* @param jobId
* @return
*/
public QuartzScheduleJob selectByPrimaryKey(Long jobId);
/**
* 修改数据
*
* @param record
* @return
*/
public int updateByPrimaryKey(QuartzScheduleJob record);
/**
* 查询状态为1的任务
*
* @return
*/
public List findEntityByStatus();
/**
* 修改状态
*
* @param id
* @param jobstatus
*/
public void updateStatus(@Param("id")Long id,@Param("jobstatus") String jobstatus);
}4:mapper.xml
INSERT INTO task_schedule_job(createtime,updatetime,jobname,jobgroup,jobstatus,executetime,
description,beanclass,isconcurrent,springid,methodname,articleid)
VALUES(#{createtime},#{updatetime},#{jobname},#{jobgroup},#{jobstatus},#{executetime},#{description},#{beanclass}
,#{isconcurrent},#{springid},#{methodname},#{articleid})
id,createtime,updatetime,jobname,jobgroup,jobstatus,executetime,
description,beanclass,isconcurrent,springid,methodname,articleid
SELECT FROM task_schedule_job
SELECT FROM task_schedule_job WHERE jobstatus=1
SELECT
FROM task_schedule_job
WHERE id=#{jobId,jdbcType=BIGINT}
DELETE FROM task_schedule_job
WHERE WHERE id=#{jobId,jdbcType=BIGINT}
UPDATE task_schedule_job SET jobstatus=#{jobstatus} WHERE id=#{id}
UPDATE task_schedule_job
createtime=#{createtime},
updatetime=#{updatetime},
jobname=#{jobname},
jobgroup=#{jobgroup},
jobstatus=#{jobstatus},
executetime=#{executetime},
description=#{description},
beanclass=#{beanclass},
isconcurrent=#{isconcurrent},
springid=#{springid},
methodname=#{methodname},
articleid=#{articleid},
WHERE id=#{id}
5:service层
public interface QuartzScheduleJobService {
/**
* 查询所有的任务信息
*
* @return
*/
public List findEntity();
/**
* 添加任务信息
*
* @param quartzScheduleJob
*/
public void addTask(QuartzScheduleJob quartzScheduleJob);
/**
* 根据编号查询任务信息
*
* @param jobId
* @return
*/
public QuartzScheduleJob selectById(Long jobId);
/**
*
* 需要执行的任务
*
*/
public void executeTasks();
}6:service实现类
@Service("quartzScheduleJobService")
@Transactional(propagation=Propagation.REQUIRED, rollbackFor={RuntimeException.class})
public class QuartzScheduleJobServiceImpl implements QuartzScheduleJobService{
public final Logger log = Logger.getLogger(this.getClass());
//定时任务信息
@Resource
private QuartzScheduleJobMapper quartzScheduleJobMapper;
//文章
@Resource
private ArticleMapper articleMapper;
/**
* 查询所有的任务信息
*
* @return
*/
@Override
public List findEntity() {
return quartzScheduleJobMapper.findEntity();
}
/**
* 添加任务信息
*
* @param quartzScheduleJob
*/
@Override
public void addTask(QuartzScheduleJob quartzScheduleJob) {
quartzScheduleJob.setCreatetime(new Date());
quartzScheduleJobMapper.saveEntity(quartzScheduleJob);
}
/**
* 根据编号查询任务信息
*
* @param jobId
* @return
*/
@Override
@Transactional(propagation=Propagation.SUPPORTS, readOnly = true)
public QuartzScheduleJob selectById(Long jobId) {
return quartzScheduleJobMapper.selectByPrimaryKey(jobId);
}
/**
*
* 需要执行的任务
*
*/
@Override
public void executeTasks(){
List joblist = quartzScheduleJobMapper.findEntityByStatus();
for(QuartzScheduleJob job1:joblist){
Date date = job1.getExecutetime();
Date currentdate = new Date();
//获取数据库的时间和当前时间做比较年月日相同 就进行修改
if(DateUtils.isSameDay(currentdate, date)){
articleMapper.updateClose(job1.getArticleid(), 0);
quartzScheduleJobMapper.updateStatus(job1.getId(),"0");
}
//测试两个时间的分钟数是否相同
/*if((date.getTime()/60000) == (currentdate.getTime()/60000)){
articleMapper.updateClose(job1.getArticleid(), 0);
quartzScheduleJobMapper.updateStatus(job1.getId(),"0");
}*/
}
}
}7:定时任务管理类
public class QuartzManager {
private Scheduler scheduler;
/**
* @Description:启动所有定时任务
*/
public void startJobs() {
try {
scheduler.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Scheduler getScheduler() {
return scheduler;
}
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
}8:页面上选择是否为定时文章,如果选择是,则选择该文章定时发送的时间然后和其他值一起传到后台
controller的方法里面判断
@Controller
@RequestMapping("/admin")
public class ArticleController {
// 文章
@Resource(name = "articleService")
private ArticleService articleService;
//定时任务
@Resource(name = "quartzScheduleJobService")
private QuartzScheduleJobService quartzScheduleJobService;
/**
* 处理文章添加
*
* @param request 请求对象
* @param article 文章对象
* @param cateid 类别
* @param oid 姓氏编号
* @param upfile 上传文件对象
* @return 返回列表页面
*/
@RequestMapping(value = "/article_add", method = RequestMethod.POST)
public String articleAddHandle(
HttpServletRequest request,
Article article,
@RequestParam(required = true, defaultValue = "0") Long cateid,
@RequestParam(required = true, defaultValue = "") String oid,
@RequestParam(required = false, value = "upfile") MultipartFile upfile,
@RequestParam(required = true, defaultValue = "") String tabid,
@RequestParam(required = true, defaultValue = "") String quartztime)
throws IOException {
// 保存信息
articleService.saveEntity(article);
/*------------ 更新数据结束 ----------------------*/
//如果文章的close为1 说明是需要定时发送的文章
if(article.getClose() == 1){
QuartzScheduleJob job = new QuartzScheduleJob();
job.setJobname(article.getTitle());
Long articleid = article.getId();
job.setArticleid(articleid);
//设置任务运行时间表达式
// quartztime 前端传过来的运行时间
Date jodtime = DateUtil.stringToDate(quartztime, "yyyy-MM-dd");
job.setExecutetime(jodtime);
job.setJobgroup("0");
job.setJobstatus("1");
job.setIsconcurrent("0");
job.setSpringid("quartzScheduleJobService");
job.setBeanclass("com.jiuqin.information.service.impl.QuartzScheduleJobServiceImpl");
job.setMethodname("executeTasks");
//向数据库保存一条记录
quartzScheduleJobService.addTask(job);
}
return "redirect:article_list.do?tabid=" + tabid + "&t=" + new Date().getTime();
}
注:有关于quartz的时间表达式的配置,百度就可以了
7098

被折叠的 条评论
为什么被折叠?



