Spring 学习 5- task 定时任务
Spring-Task
1、这是网上的: 后面是我自己的配置
Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式,下面将分别介绍这两种方式。
第一种:配置文件方式
第一步:编写作业类
即普通的pojo,如下:
import org.springframework.stereotype.Service;
@Service
public class TaskJob { public void job1() {
System.out.println(“任务进行中。。。”);
}
}
第二步:在spring配置文件头中添加命名空间及描述
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
。。。。。。
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
第三步:spring配置文件中设置具体的任务
说明:ref参数指定的即任务类,method指定的即需要运行的方法,cron及cronExpression表达式,具体写法这里不介绍了,详情见上篇文章附录。
<context:component-scan base-package="com.gy.mytask" />这个配置不消多说了,spring扫描注解用的。
到这里配置就完成了,是不是很简单。
第二种:使用注解形式
也许我们不想每写一个任务类还要在xml文件中配置下,我们可以使用注解@Scheduled,我们看看源文件中该注解的定义:
可以看出该注解有三个方法或者叫参数,分别表示的意思是:
cron:指定cron表达式
fixedDelay:官方文档解释:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。
fixedRate:官方文档解释:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即从上一个任务开始到下一个任务开始的间隔,单位是毫秒。
下面我来配置一下。
第一步:编写pojo
第二步:添加task相关的配置:
说明:理论上只需要加上<task:annotation-driven />这句配置就可以了,这些参数都不是必须的。
Ok配置完毕,当然spring task还有很多参数,我就不一一解释了,
具体参考xsd文档http://www.springframework.org/schema/task/spring-task-3.0.xsd。
2、这是我自己的配置,可以正常运行的
在springmvc-servlet.xml 中配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" > <!-- Enables the Spring Task @Scheduled programming model -->
<task:executor id="executor" pool-size="5"/>
<task:scheduler id="scheduler" pool-size="10"/>
<task:annotation-driven executor="executor" scheduler="scheduler"/> <context:annotation-config /> </beans>
在java中的配置:
/**
* com.zywang.spring.task.SpringTaskDemo.java
* @author ZYWANG 2011-3-9
*/
package com.linemessage.application.module.messageschedule; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; /**
* Spring3 @Scheduled 演示
* @author ZYWANG 2011-3-9
*/
@Component
public class StartSchedule { @Autowired
private TMessageScheduleDAO iMssageScheduleDao; @Autowired
private TMessageDAO iMssageDao;
@Autowired
private PrdCataDAO prdCataDAO; @Autowired
private TGroupDAO iGroupDAO;
@Autowired
private TGroupUserRelDAO iGroupUserRelDAO; @Autowired
private TProductDAO iProductDao; @Autowired
private UserSubDAO iUserSubDao; @Autowired
private TMessageStatusDAO iMssageStatusDao; @Autowired
private TMessageDurationDAO iMssageDurationDao; @Autowired
private TLocationDescDAO iTLocationDescDAO; @Autowired
private ClientUserDAO iClientUserDao;
@Autowired
private TPublisherDAO iTPublisherDAO; @Autowired
private TGroupUserRelDAO tGroupUserRelDAO; @Autowired
private PublisherProductRelDAO publisherProductRelDao; @Autowired
private TSubscribeDAO tSubScribeDAO; @Scheduled(cron = "0 0/15 * * * ?")//每15分钟运行一次
void messageSchdule() throws SQLException{
//System.out.println("I'm doing with cron now!"); Date end_time = new Date();
Date begin_time =new Date(end_time.getTime()-15*60*1000); //暂时设置为15分钟与cron对应
TMessageScheduleExample scheduleE = new TMessageScheduleExample();
scheduleE.createCriteria().andSendTimeBetween(begin_time,end_time).andIsvalidateEqualTo("1"); List<TMessageSchedule> schedules= iMssageScheduleDao.selectByExample(scheduleE); for(TMessageSchedule tms:schedules)
{
//从数据库取出消息
TMessageExample messageE = new TMessageExample();
messageE.createCriteria().andIdEqualTo(tms.getId()); List<TMessage> messages= iMssageDao.selectByExampleWithBLOBs(messageE);
TMessage message=messages.get(0); //取出接收人
TMessageStatusExample statusExample = new TMessageStatusExample();
statusExample.createCriteria().andMessageIdEqualTo(tms.getId());
List<TMessageStatus> statusList=iMssageStatusDao.selectByExample(statusExample);
//为所以接收人设置缓存 for(TMessageStatus status:statusList)
{
UserMessageCache.store(status.getDevicetoken(), "" + message.getId());
} //存储APPLE 手机的PUSHTOKEN
List<String> applehash= new ArrayList<String>(); List<TMessageStatus> appleList=iMssageStatusDao.selectByExample4Apple(statusExample); for (TMessageStatus status:appleList)
{ //如果是APPLE用户,则发送通知
applehash.add(status.getDevicetoken());
} // 创建缓存,给终端用户使用,缓存对像
SendMessage.store(message.getId() + "", message); //如果是苹果用户,发送通知
AppleSend sender= new AppleSendImpl(applehash,message.getTitle());
sender.send(); //做完之后,将t_mnessage_schedule的状态置为false // message
TMessageSchedule messageSchedule = iMssageScheduleDao
.selectByPrimaryKey(message.getId());
messageSchedule.setIsvalidate("0");
iMssageScheduleDao.updateByPrimaryKeySelective(messageSchedule); } //==以下为清除过期Message
TMessageDurationExample TMDExample = new TMessageDurationExample();
TMDExample.createCriteria().andIsvalidateEqualTo("1").andEndTimeLessThan(new Date());
List<TMessageDuration> messageDList=iMssageDurationDao.selectByExample(TMDExample);
for(TMessageDuration tms:messageDList)
{ tms.setIsvalidate("0");
iMssageDurationDao.updateByPrimaryKeySelective(tms); TMessageStatusExample statusExample = new TMessageStatusExample();
statusExample.createCriteria().andMessageIdEqualTo(tms.getMessageId()).andStatusNotEqualTo("0");
List<TMessageStatus> statusList=iMssageStatusDao.selectByExample(statusExample);
List<String>userIds=new ArrayList<String>();
for(TMessageStatus status:statusList)
{
userIds.add(status.getDevicetoken()); }
for (String deviceToken:userIds)
{
UserMessageCache.remove(deviceToken,String.valueOf(tms.getMessageId()));
}
SendMessage.remove(String.valueOf(tms.getMessageId())); // message
} }
参考 Spring定时任务的几种实现:
Spring 学习 5- task 定时任务的更多相关文章
- Spring task定时任务执行一段时间后莫名其妙停止的问题
前因: 我写了一个小项目,主要功能是用Spring task定时任务每天定时给用户发送邮件.执行了几个月一直没有问题,前几天,莫名其妙的突然不再发送邮件了. 只好花费一些时间来查看到底是什么原因造成的 ...
- Spring Task定时任务的配置和使用详解
spring中使用定时任务 1.基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.or ...
- SpringBoot定时任务 - Spring自带的定时任务是如何实现的?有何注意点?
通过前文我们基本梳理了定时任务体系:Timer和ScheduledExecutorService是JDK内置的定时任务方案,以及Netty内部基于时间轮实现的HashedWheelTimer,再到Qu ...
- spring注解scheduled实现定时任务
只想说,spring注解scheduled实现定时任务使用真的非常简单. 一.配置spring.xml文件 1.在beans加入xmlns:task="http://www.springfr ...
- Spring Boot(九):定时任务
Spring Boot(九):定时任务 一.pom包配置 pom包里面只需要引入springboot starter包即可 <dependencies> <dependency> ...
- 品Spring:关于@Scheduled定时任务的思考与探索,结果尴尬了
非Spring风格的代码与Spring的结合 现在的开发都是基于Spring的,所有的依赖都有Spring管理,这没有问题. 但是要突然写一些非Spring风格的代码时,可能会很不习惯,如果还要和Sp ...
- spring的Scheduled(定时任务)和多线程
一.前言 在我们日常的开发中,经常用到数据同步的更新,这时我们采用的是spring的定时任务和java的多线程进行数据的更新,进行时实的服务调用. 二.实现思路 1.创建线程类 ...
- spring 学习之 bean 的注入方式 property和constructor-arg的使用方式
spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...
- Spring学习之AOP总结帖
AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...
- Spring学习之第一个AOP程序
IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...
随机推荐
- 20155216 2016-2017-2 《Java程序设计》第四周学习总结
教材学习内容总结 理解封装.继承.多态的关系 封装:使用类方法或函数将程序进行封装,并定义其内部的成员以及数据. 继承:子类继承父类,避免重复的行为定义. 多态:子类只能继承一个父类,即其中存在is- ...
- 20155315 2016-2017-2 《Java程序设计》第三周学习总结
教材学习内容总结 1.构造方法决定类生成对象的方式 用this将已存在的参数的值指定给此参数. 用new建立新的实例. class Clothes { String color; char size; ...
- C#基础之接口
对于接口一直以来都清楚自己理解的不深入,这两天重温以前的代码时更加发现对接口的理解仅仅限于定义而已,得好好学学接口了. 1.接口的特点 接口的定义是指定一组函数成员而不实现成员的引用类型,其它类型和接 ...
- Nginx入门篇(二)之Nginx部署与配置文件解析
一.Nginx编译安装 ()查看系统环境 [root@localhost tools]# cat /etc/redhat-release CentOS Linux release (Core) [ro ...
- Mac 必备工具之 brew
brew 是 Mac 下的一个包管理工具,类似于 centos 下的 yum,可以很方便地进行安装/卸载/更新各种软件包,例如:nodejs, elasticsearch, kibana, mysql ...
- arcpy示范教学(一):基本操作
arcpy基本操作 打开目录,遍历目录,打开要素类,遍历要素,打开文件,写入属性值 import arcpy import codecs # 设置工作目录 arcpy.env.workspace = ...
- hexo部署
title: hexo 部署(一) date: 2018-09-16 18:01:26 tags: hexo部署配置 categories: 博客搭建 hexo博客搭建 折腾了好久的时间,终于使用he ...
- css布局笔记(一)
布局方式 一列布局 通常固定宽高,用margin:0 auto:居中显示 两列布局 说起两列布局,最常见的就是使用float来实现.float浮动布局的缺点是浮动后会造成文本环绕等效果,以及需要及时清 ...
- 怎样安装TortoiseGit
TortoiseGit是基于Windows的Git图形化工具 访问 https://tortoisegit.org/
- 前端之JavaScript(一)
一.JavaScript前世今生 它最初由Netscape的Brendan Eich设计.JavaScript是甲骨文公司的注册商标.Ecma国际以JavaScript为基础制定了ECMAScript ...