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 定时任务的更多相关文章

  1. Spring task定时任务执行一段时间后莫名其妙停止的问题

    前因: 我写了一个小项目,主要功能是用Spring task定时任务每天定时给用户发送邮件.执行了几个月一直没有问题,前几天,莫名其妙的突然不再发送邮件了. 只好花费一些时间来查看到底是什么原因造成的 ...

  2. Spring Task定时任务的配置和使用详解

    spring中使用定时任务 1.基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.or ...

  3. SpringBoot定时任务 - Spring自带的定时任务是如何实现的?有何注意点?

    通过前文我们基本梳理了定时任务体系:Timer和ScheduledExecutorService是JDK内置的定时任务方案,以及Netty内部基于时间轮实现的HashedWheelTimer,再到Qu ...

  4. spring注解scheduled实现定时任务

    只想说,spring注解scheduled实现定时任务使用真的非常简单. 一.配置spring.xml文件 1.在beans加入xmlns:task="http://www.springfr ...

  5. Spring Boot(九):定时任务

    Spring Boot(九):定时任务 一.pom包配置 pom包里面只需要引入springboot starter包即可 <dependencies> <dependency> ...

  6. 品Spring:关于@Scheduled定时任务的思考与探索,结果尴尬了

    非Spring风格的代码与Spring的结合 现在的开发都是基于Spring的,所有的依赖都有Spring管理,这没有问题. 但是要突然写一些非Spring风格的代码时,可能会很不习惯,如果还要和Sp ...

  7. spring的Scheduled(定时任务)和多线程

    一.前言 在我们日常的开发中,经常用到数据同步的更新,这时我们采用的是spring的定时任务和java的多线程进行数据的更新,进行时实的服务调用. 二.实现思路            1.创建线程类 ...

  8. spring 学习之 bean 的注入方式 property和constructor-arg的使用方式

    spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...

  9. Spring学习之AOP总结帖

    AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...

  10. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...

随机推荐

  1. MFC中两个对话框之间数据传递

    以下是在网上参考的一篇文章,网址:https://blog.csdn.net/foreverhuylee/article/details/21707197 这里有两种情况, 第一种情况是: (在一个基 ...

  2. 20155217 2016-2017-2 《Java程序设计》第6周学习总结

    20155217 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 InputStream与OutputStream 10.1.1串流设计的概念 Jav ...

  3. 安装虚拟机及学习linux系统 20155222卢梓杰

    安装虚拟机及学习linux系统 20155222卢梓杰 首先按照要求下载virtualbox,没有遇到问题. 接下来新建一个虚拟机,按照要求应当安装乌班图64,这里只有32位的.在网上搜寻了许久,终于 ...

  4. 20155313 2016-2017-2 《Java程序设计》第二周学习总结

    20155313 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 1.1 基本类型 整数:可细分为short整数(占2字节).int整数(占4字节)与long ...

  5. 在Linux中安装JDK和IDEA

    前言 寒假安装虚拟机的时候我就没有安装好,到学校之后,因为时间紧加上更习惯Windows的操作习惯,我只在Windows上安装了JDK和IDEA,但是随着学习的深入,我发现用虚拟机写命令行.新建jav ...

  6. sql语句-8-sql学习流程

  7. day1 Opencv安装 python 2.7 (32位)

    [参考安装步骤] http://opencv-python-tutroals.readthedocs.io/en/latest/index.html http://blog.csdn.net/huru ...

  8. day2 CSS- 选择器

    1.CSS 语法 css是英文Cascading Style Sheets的缩写,称为层叠样式表 2.css的四种引入方式 1.行内式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现 ...

  9. Gulp 有用的地址

    gulp似乎成为web开发的必选工具. 推荐一个非常好的入门教程 https://markgoodyear.com/2014/01/getting-started-with-gulp/ 官方插件列表: ...

  10. Drupal views 学习之初识

    1. 简介 用过Yii框架的同学,应该都会用到过GridView和ListView组件.可以很方便的用网格或列表展示内容. 例如淘宝: 网格显示 列表显示 2. 使用view可以方便的配出类似上面的展 ...