Spring-Quertz配置每隔三个小时执行一次函数

  • applicationContext-quertz.xml的配置,开启job任务注解
<?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:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-2.5.xsd 
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
	http://www.springframework.org/schema/task 
    http://www.springframework.org/schema/task/spring-task-3.1.xsd ">
 
   <task:annotation-driven/>  
</beans>
  • 假设有一个类叫Timmer
@Component(Timmer.serialVersionUID + "")
public class Timmer implements Serializable{

	private static final long serialVersionUID = -2499873556819765772L;
    
	private static Log logger = LogFactory.getLog(Timmer.class);
	
	@Scheduled(cron = "0 0 */3 * * ?")
	public void timer() throws Exception {
          try{
     	  //处理当前一天的数据
    		
          }catch (Exception e) {
			logger.debug(e.getMessage());
		}	
     } 		
	}
  • 由于不止一个这样的timmer所以,当第一个timmer到第二个timmer的时候会存在一定的误差,所以就需要考虑到凌晨十二点不是整点触发进入程序的,所以这个误差的范围需要考虑,又因为每天凌晨跑的应该是昨天一天的数据而且误差范围不能大于零点之后的三个小时因为凌晨三点执行的是当天的数据,所以说误差范围就是当前时间小于凌晨三点就跑昨天的数据。
我们用Calendar类进行处理,Date不适用于改变时间
首先获取当前的时间
1.获取Calendar的对象 Calendar c = Calendar.getInstance();
2.获取当前时间的毫秒数用来比较当天凌晨三点的毫秒数,判断时间范围用的
long currentMills = c.getTimeInMillis(); 
3.//c.getTime();得到的是一个当前时间的Date对象
计算一天的数据为 当天的头一天的23:59:59到当天的明天的00:00:00
4.获取头一天的23点59分59秒,并格式化时间为“YYYY-MM-dd HH:mm:ss”
String sdTime = ReportUitls.format(TimeUtil.preDay(c.getTime()));
TimeUtil.preDay()的函数为:
public Date preDay(Date date){
	Calendar c1 = Calendar.getInstance();
	c1.setTime(date);
	c1.add(c1.DATE,-1); //c.DATE 指示一个月中的某天。DAY_OF_MONTH 也可以
	c1.set(c.get(c1.YEAR),c1.get(c1.MONTH),c1.get(c1.DAY_OF_MONTH),23,59,59);   
	//get(int field)  返回给定日历字段的值。
	return new Date(c.getTimeInMillis());
}	

5.获取头一天的00点00分00秒,并格式化时间为“YYYY-MM-dd HH:mm:ss”
String edTime = ReportUitls.format(TimeUtil.backDay(c.getTime()));
TimeUtil.backDay()的函数为:
public Date backDay(Date date){
	Calendar c1 = Calendar.getInstance();
	c1.setTime(date);
	c1.add(c1.DATE,1); //c.DATE 指示一个月中的某天。DAY_OF_MONTH 也可以
	c1.set(c.get(c1.YEAR),c1.get(c1.MONTH),c1.get(c1.DAY_OF_MONTH),00,00,00);   
	//get(int field)  返回给定日历字段的值。
	return new Date(c.getTimeInMillis());
}
6.或指定的当天的凌晨三点的Calendar对象
	Calendar threeCal = Calendar.getInstance();
	threeCal.set(threeCal.get(threeCal .YEAR),threeCal .get(threeCal .MONTH),threeCal .get(threeCal.DAY_OF_MONTH),03,00,00);  	 
  • 最后为timmer收尾
	@Scheduled(cron = "0 0 */3 * * ?")
	public void timer() throws Exception {
          try{
  			Calendar c = Calendar.getInstance(); 
			String sdTime = ReportUitls.format(TimeUtil.preDay(c.getTime()));
			String edTime = ReportUitls.format(TimeUtil.backDay(c.getTime()));
			
	        Calendar threeCal = Calendar.getInstance();
	        threeCal.set(threeCal.get(threeCal.YEAR),threeCal.get(threeCal.MONTH),threeCal.get(threeCal.DAY_OF_MONTH),03,00,00);   
            if(c.getTimeInMillis()<threeCal.getTimeInMillis()){
            	c.add(Calendar.DATE, -1);
            	sdTime = ReportUitls.format(TimeUtil.preDay(c.getTime()));
            	edTime = ReportUitls.format(TimeUtil.backDay(c.getTime()));
            }        	  
        	  
          //在这处理service层的数据将sdTime和edTime传入,处理当天一天的数据
          }catch (Exception e) {
			logger.debug(e.getMessage());
			System.out.println(e.getMessage());
		}	
      		
	}
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-boot-starter-parent是Spring Boot框架中的一个父项目,它提供了一些默认的依赖管理和配置,用于简化Spring Boot应用的构建和开发过程。每个版本的spring-boot-starter-parent都会随着Spring Boot的发布而更新,以提供最新的特性、修复bug和改进性能。 每个版本的spring-boot-starter-parent可能会有以下方面的差别: 1. Spring Boot版本:每个spring-boot-starter-parent版本都与特定的Spring Boot版本相关联。因此,不同版本的spring-boot-starter-parent会带来不同版本的Spring Boot框架,其中可能包括新的特性、重要的改动或者修复的Bug。 2. 默认依赖版本:spring-boot-starter-parent会预定义一些常用的依赖版本,比如Spring Framework、Spring Data、Hibernate等。每个版本的spring-boot-starter-parent都会更新这些默认依赖的版本,以确保与Spring Boot框架的兼容性和稳定性。 3. 插件配置spring-boot-starter-parent还会定义一些常用的Maven插件,并配置了一些默认行为。这些插件可以帮助开发人员在构建、测试和部署过程中更加方便地使用Spring Boot。不同版本的spring-boot-starter-parent可能会更新这些插件的版本或者修改默认的配置。 总之,每个版本的spring-boot-starter-parent都旨在提供一个稳定和可靠的基础,以便开发人员可以更加方便地使用和扩展Spring Boot框架。因此,建议在开始一个新的Spring Boot项目时,选择最新版本的spring-boot-starter-parent来获得最佳的开发体验和最新的功能支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值