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. 20155202 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155202 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 使用JDK编译.运行简单的java程序 命令行下的程序开发 一(新建文件夹): 打开wi ...

  2. 20155305乔磊2016-2017-2《Java程序设计》第一周学习总结

    学习考核方式后感 老师对于成绩的获得有很多细节的地方,获得高分很不容易,考核次数也很多,100分分为课堂考核,实验,团队项目,老师对我们的要求可以说非常的严格,我也为有一个要求严格的老师感到幸运荣幸. ...

  3. removeAttribute与removeAttributeNode的区别

    1.removeAttributeNode() 方法删除指定的属性,并以 Attr Node 对象返回被删除的属性. 例: <!DOCTYPE html><html><b ...

  4. PostgreSQL参数学习:wal_keep_segments

    http://www.postgresql.org/docs/9.3/static/runtime-config-replication.html 参考官方文档: wal_keep_segments ...

  5. pycharm设置github

    1.打开file,选择settings,找到Version Contorl,打开找到GitHub ,HOST填github.com,用户名,密码,test,稍等一会,会提示成功 2. 设置好以后 打开 ...

  6. 基于ejabberd简单实现xmpp群聊离线消息

    首先,xmpp服务器是基于ejabberd.离线消息模块是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact: 修改后实现群聊离线 ...

  7. javaweb(八)——HttpServletResponse对象(二)

    一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类, 生成随机图片范例: 1 package gacl ...

  8. python-模块详解

    模块: 模块的分类: 第三方模块/扩展模块:没在安装python解释器的时候安装的那些功能 自定义模块:你写的功能如果是一个通用的功能,那你就把它当做一个模块 内置模块:安装python解释器的时候跟 ...

  9. 使用phpMyAdmin管理网站数据库(创建、导入、导出…)

    作为一名站长,最重视的就是网站的数据安全了.本节襄阳网站优化就来讲讲如何使用phpMyAdmin管理软件进行mysql数据库的管理,实现基本的数据库管理用户.数据库的创建.数据的导入和导出操作(网站备 ...

  10. 【转】RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】

    接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动化脚本通过RobotFrameWork将命令传递给Appium的客户端: 2.然后[Appium的客户端]将接受 ...