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 开发时,都是基于对 ...
随机推荐
- 20155203 2016-2017-3 《Java程序设计》第4周学习总结
20155203 2016-2017-3 <Java程序设计>第4周学习总结 教材学习内容总结 1.父类和子类类似于集合和元素,不同的地方是子类可以拓展(extends)父类之外的方法. ...
- nowcoder wannafly 25 E:01串
E:01 串 链接 分析: 线段树维护转移矩阵.每个节点是一个矩阵,区间内的矩阵乘起来就是答案矩阵.矩阵乘法满足结合律,所以线段树维护. 代码: #include<cstdio> #inc ...
- idea 安装后需要手动设置 64位的vmoptions (为了更好的性能和体验)
- 【Unity3d】ScriptableObject的简单用法
ScriptableObject非常适合小数量的游戏数值. 使用ScriptableObject的时候需要注意,生成ScriptableObject数据文件需要自己写Editor代码实现. 大概的 ...
- bilibili携手WeTest,保障视频类应用优质适配体验
WeTest 导读 中国移动视频用户规模越来越大,各类移动视频APP也百家争鸣, B站作为国内知名的年轻人文化社区,bilibili在推出移动端时,除了坚持自身的独特定位以外,对其APP的质量也十分重 ...
- 提取验证码到winform上webbroswer和axwebbroswer
在网上只有webbroswer的代码,所以自己又修改了修改改成axwebbroswer的 public static class yanZhengMaHelp { //webbrowser验证码 pu ...
- 在tomcat5中发布项目时,用IP地址+端口不能访问项目,而用localhost加端口时可以访问成功
最近在开发项目中,遇到的一个问题是: 在 tomcat中发布一个web项目,但是发布成功后,只能用http://localhost:8080/fm访问项目,不能用 http://127.0.0.1:8 ...
- PHP反序列化漏洞代码审计—学习资料
1.什么是序列化 A.PHP网站的定义: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值. ...
- linux信号处理相关知识
因为要处理最近项目中碰上的多个子进程退出信号同时到达,导致程序不当产生core的情况,今天我花了时间看了一些关于linux信号处理的博客. 总结一下:(知识未经实践) linux信号分两种,一种实 ...
- 【java请求】- jmeter_jdbc脚本实战
一,导入 使用Jmeter运行Java脚本,需要用到Jmeter的提供的框架jar包(分别在jmeter目录下的lib和ext目录下)1.ApacheJMeter_core.jar2.ApacheJM ...