使用spring注解执行定时任务
前言:之前用过quartz框架执行定时调度问题,然后感觉比较麻烦。最近看了下人家的项目,发现都是直接在spring使用注解去执行任务了,所以想记录下来方便以后使用。
废话不多说,直接来干货
1.新建fmb-platform-schedule-server.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:jaxws="http://cxf.apache.org/jaxws" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" default-lazy-init="true" default-autowire="byType"> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <import resource="classpath*:/applicationContext-ds.xml"/> <import resource="classpath:xxx-platform-finance-client.xml"/> <bean id="fmb-properties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="location" value="classpath:xxx.properties"/> </bean> <context:annotation-config/> <context:component-scan base-package="cn.xxx"/> <task:annotation-driven/> </beans>
如上:要有spring定时执行文件:
xmlns:task="http://www.springframework.org/schema/task" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"
然后要加上task任务扫描注解:
<task:annotation-driven/>
我们扫描的包是:
context:component-scan base-package="cn.xxx"/>
注:在配置的时候:
default-lazy-init="true" default-autowire="byType"
autowire的装载方式不能是byName,不然会报装载错误的日志。然后还有这里配置的默认是懒加载,所以在定时器执行时候必须要注解为@Lazyload(false),否则会报错!
2.java文件编写:(在扫描的cn.xxx包下面)
//定时处理到期订单产品 @Component @Lazy(false) public class DueOrderProductQuartz extends BaseService{ @Autowired private OrderProductInfoService orderProductInfoService; //每天凌晨1点执行 @Scheduled(cron="0 0 1 * * ?") // @Scheduled(cron="0/60 * * * * ?")//测试 public void queryDueOrderProduct() { log.info(Utils.getCurrentDate() + "执行DueOrderProductQuartz-->queryDueOrderProduct"); try { int pageNum = 1; int pageSize = 20; QueryResult<OrderProductInfoDto> ret = orderProductInfoService.queryDueProductRet(1,1,1); if(Utils.isNotNull(ret) && Utils.isNotEmpty(ret.getResults())){ Integer total = ret.getTotal(); int size = total / pageSize + 1; for (int i = 0; i < size; i++) { ret = orderProductInfoService.queryDueProductRet(pageNum + i,pageSize,0); if(Utils.isNotNull(ret) && Utils.isNotEmpty(ret.getResults())){ orderProductInfoService.dealDueOrderProduct(ret.getResults()); Thread.sleep(5000);//暂停5秒让接口处理 } } } } catch (Exception e) { log.error(Utils.getCurrentDate()+":queryDueOrderProduct"+e.getMessage(),e); } } }
上面是@Scheduled是spring定时配置,
注:@Lazyload(false),不能是懒加载,不然定时器不会执行!
然后下面再普及下常用的cron表达式:
CRON表达式 含义 "0 0 12 * * ?" 每天中午十二点触发 "0 15 10 ? * *" 每天早上10:15触发 "0 15 10 * * ?" 每天早上10:15触发 "0 15 10 * * ? *" 每天早上10:15触发 "0 15 10 * * ? 2005" 2005年的每天早上10:15触发 "0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发 "0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发 "0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 "0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发 "0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发 "0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发
4.ok,全局的配置就是这么简单!
相关推荐
与卿画眉共浮生 2020-11-13
smalllove 2020-11-03
hellowordmonkey 2020-11-02
丽丽 2020-10-30
周太郎 2020-10-28
greensomnuss 2020-10-27
职业炮灰 2020-10-16
与卿画眉共浮生 2020-10-14
feinifi 2020-10-14
feinifi 2020-10-13
yangjinpingc 2020-10-09
davis 2020-09-29
RickyIT 2020-09-27
lisongchuang 2020-09-27
tangxiong0 2020-09-03
meleto 2020-08-17
幸运小侯子 2020-08-14
YangHuiLiang 2020-08-06