spring定时器(注解的形式)
最近有个需求,要在凌晨的时候,根据某几张表生成一张定时任务表里的数据,数据的状态为0(未整改),然后在当天晚上,再把这些数据的状态没改变的,改变状态为1(待整改),然后要用到定时器,百度了一下用注解形式的很方便,还能在一个方法里有多个定时任务,所以就试着试了一下,详情如下:
spring-task.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:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd "> <!-- 配置task任务扫描注解 -->
<task:annotation-driven/> <!-- 指定task任务扫描位置 -->
<context:annotation-config/>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<context:component-scan base-package="com.infohold.city.map.controller.web"/> </beans>
web.xml中配上spring-task.xml的加载:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-dao.xml,classpath:spring-mvc.xml,classpath:spring-service.xml,classpath:spring-task.xml</param-value>
</context-param>
然后就可以通过注解实现定时任务啦,
package com.infohold.city.map.controller.web; import javax.annotation.Resource;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller; import com.infohold.city.map.service.TaskService; @Controller
@Component
public class TaskController{ @Resource
private TaskService taskService; /**
*
* 定时器--添加排查任务
* 每天凌晨0:50定时生成数据
*/
@Scheduled(cron="0 55 0 * * ?")
public void getCompanyCheckTask() {
taskService.getCompanyCheckTask();
} /**
*
* 定时器--修改排查任务状态为3(未执行)
* 定时器每天晚上23:50 修改当天凌晨0:50到1:50的数据
*/
@Scheduled(cron="0 50 23 * * ? ")
public void updateCompanyCheckTask() {
taskService.updateCompanyCheckTask();
}
}
需要注意的是,刚开始我为了偷懒就把定时器的配置加在了spring-mvc.xml中,后来发现定时器可以启动成功,但是接口敲完也测完,发布到服务器之后,发现数据库里生成了两条一模一样的数据,检查代码没发现有啥不妥,当时的serviceimpl层的代码如下:
package com.infohold.city.map.service.impl; import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.infohold.city.map.dao.mybatis.CompanyCheckTaskDao;
import com.infohold.city.map.dao.mybatis.CompanycheckplanmonthDao;
import com.infohold.city.map.dao.mybatis.CompanycheckplanmonthitemDao;
import com.infohold.city.map.dao.mybatis.TaskDao;
import com.infohold.city.map.model.CompanyCheckPlanMonth;
import com.infohold.city.map.model.CompanyCheckPlanMonthItem;
import com.infohold.city.map.model.CompanyCheckTask;
import com.infohold.city.map.service.TaskService;
import com.infohold.city.map.util.CommonUtil; @Service
@Transactional
public class TaskServiceImpl implements TaskService{
@Resource
private TaskDao taskDao;
@Resource
private CompanycheckplanmonthDao companycheckplanmonthDao;
@Resource
private CompanycheckplanmonthitemDao companycheckplanmonthitemDao;
@Resource
private CompanyCheckTaskDao companyCheckTaskDao; @Override
public void getCompanyCheckTask() {
//月度计划+月度计划项 列表
List<CompanyCheckPlanMonth> companycpmlist=companycheckplanmonthDao.getCompanyCheckPlanMonthList();
GregorianCalendar calendar=new GregorianCalendar();
// 取出当前的年,月,日
int year=calendar.get(calendar.YEAR);
// 月的数值加1,使之变成习惯的月份大小(1~12月)
int month=calendar.get(calendar.MONTH)+;
int today=calendar.get(calendar.DAY_OF_MONTH); for (CompanyCheckPlanMonth companyCheckPlanMonth : companycpmlist) {
List<CompanyCheckPlanMonthItem> Companycheckplanmonthitemlist = companyCheckPlanMonth.getGetCompanycheckplanmonthitemlist();
int i=;
for (CompanyCheckPlanMonthItem companyCheckPlanMonthItem : Companycheckplanmonthitemlist) {
CompanyCheckTask companyCheckTask = new CompanyCheckTask();
companyCheckTask.setId(CommonUtil.getUUID());
String num = String.format("%04d",i);
companyCheckTask.setName(companyCheckPlanMonthItem.getName()+month+today+num);
companyCheckTask.setState("");
companyCheckTask.setCreateUser("定时器机器人");
companyCheckTaskDao.insertCompanyCheckTask(companyCheckTask);
i++;
}
}
} @Override
public void updateCompanyCheckTask() {
CompanyCheckTask companyCheckTask = new CompanyCheckTask();
companyCheckTask.setCheckTime(new Date());
companyCheckTask.setState("");
companyCheckTask.setCreateUser("定时器机器人");
companyCheckTaskDao.updateCompanyCheckTask1(companyCheckTask);
} }
在线Cron自动生成器:http://cron.qqe2.com/
检查了很多遍代码,发现没有问题,然后本地测试也是就生成一次代码,但是为什么代码提交到服务器上就会执行两次呢,百度了老半天,有说tomcat配置的问题,有说spring加载了两次呆滞的问题,后来尝试着把配置文件从springmvc.xml中隔离出来,果然好使,所以这以后的配置文件还是不能瞎加啊,借此警告自己。作为一名小菜鸟程序员,还是不能偷懒啊~~
spring定时器(注解的形式)的更多相关文章
- Spring定时器注解配置
spring-task.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- 注解式开发spring定时器
1:spring 配置文件中增加这句 <task:annotation-driven/> 2:确保扫描程序能够扫描后 下面第3步骤的java类 <context:co ...
- spring的注解形式:@Repository、@Service、@Controller,
Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. @Repository.@Service.@C ...
- spring 基于注解的@Scheduled和quartz定时器两种实现
一.使用quartz 1.由于我的项目jar包使用的maven托管的,在pom文件中加入quartz的依赖就可以 2.配置quartz-context.xml,确保xml文件能被加载到 <?xm ...
- spring定时器,定时器一次执行两次的问题
Spring 定时器 方法一:注解形式 配置文件头加上如下: xmlns:task="http://www.springframework.org/schema/task" htt ...
- Spring系列之Spring常用注解总结
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- spring定时器,当遇见半小时的情况时
spring定时器遇见半小时的解决方法(这里只提供注解方式) @Scheduled(fixedRate=6000000)//每隔100分钟执行方法 fixedRate的值是毫秒
- atititt.java定时任务框架选型Spring Quartz 注解总结
atititt.java定时任务框架选型Spring Quartz 总结 1. .Spring Quartz (ati recomm) 1 2. Spring Quartz具体配置 2 2.1. 增 ...
- 使用轻量级Spring @Scheduled注解执行定时任务
WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了 ...
- spring定时器用Annotation兑现
spring定时器用Annotation实现 0人收藏此文章, 我要收藏发表于3个月前 , 已有46次阅读 共0个评论 1.ApplicationContext.xml配置 a).需要在xmlns里面 ...
随机推荐
- 170317、到底什么时候该使用MQ?
一.缘起 一切脱离业务的架构设计与新技术引入都是耍流氓. 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题. 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什么问 ...
- Spring Data 查询方法的规则定义(五)
有句话这样说 欲练神功 挥刀自宫 请亲们先回到第一个 从Spring data 介绍 开始看 搭好环境 跟着步伐一块走 Spring Data 的方法必须严格按照它的规范进行编写,如果写错了 ...
- 剑指Offer——把数组排成最小的数
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 排 ...
- 剑指Offer——复杂链表的复制
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...
- python 将日期戳(五位数时间)转换为标准时间
5位数日期戳 读取 .mat 文件处理里面数据时,发现里面的日期数据全部都是 “5位数” 数字,很不解: 后来查到可以在excel中通过设置单元格调回标准日期格式,如下: 选中日期戳,右键选择 “格式 ...
- linux内核获取当前进程路径分析
一个简单的问题,·linux下获取当前进程.我们都知道在内核中获取当前进程可以利用current宏 #define get_current() (current_thread_info()->t ...
- Redis常见操作
1. 对于key的所有操作 del key1 key2 … keyn 作用:删除1个或者多个键返回值:不存在的key忽略掉,返回真正删除的key的数量 rename key newkey 作用:给ke ...
- python操作socket
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- quick cocos2d-x 下载地址
https://github.com/chukong/quick-cocos2d-x/tree/master http://www.cocos2dx.net/post/280 配置说明 http:// ...
- OS X 10.9 Mavericks下如何安装Command Line Tools(命令行工具)
OS X 10.9 Mavericks下如何安装Command Line Tools(命令行工具) 今天OS X 10.9 Mavericks正式发布,免费更新,立即去更新看看效果. 不过升级后安装命 ...