https://www.cnblogs.com/FlyHeLanMan/p/6428878.html
http://t.zoukankan.com/liuchao102-p-6064819.html
第一步,修改spring.xml配置文件
在xsi:schemaLocation中加入
1 http://www.springframework.org/schema/task 2 http://www.springframework.org/schema/task/spring-task-3.2.xsd
同时加入
1 xmlns:task=”http://www.springframework.org/schema/task
第二步,开启task注解
1
第三步,编写作业类,并在作业类中加入注解
1 @Component(“myTask”) 2 @Lazy(false) 3 public class MyTask { 4 5 @Scheduled(cron=”0/5 ?”) 6 public void run(){ 7 SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); 8 System.out.println(sdf.format(new Date()) + “定时任务执行”); 9 } 10 }
注意:使用Lazy注解是因为spring 配置文件采用懒加载的原因default-lazy-init=”true” 这个配置会导致 @Scheduled失效
————————————————————————
项目框架: SpringMVC、MyBatis、JSP
- 首先配置spring.xml文件
<?xml version=”1.0” encoding=”UTF-8”?>
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.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd”>
<!-- 注解定时任务 --><br /> <task:annotation-driven/><br />2. 配置定时任务类
@Component
public class MessageSendService {
/**<br /> * 记录日志类<br /> */<br /> public Log logger = LogFactory.getLog(this.getClass());
/**<br /> * 定时任务方法<br /> */<br /> @Scheduled(cron = "0/10 * * * * ? ")<br /> public void send(){<br /> logger.info("start.....");<br /> }
}
@Component 注解是让Spring可以扫描到并初始化,第一步的配置就是做这个用的
@Scheduled 注解是配置定时任务的执行时间,上面的配置是让定时任务每10执行一次send()方法
- 实际的项目中定时任务的执行时间可能要在配置文件中配置,就需要用到另一个注解 @PropertySource
@Component
@PropertySource(value=”classpath:application.properties”)
public class MessageSendService {
/**<br /> * 记录日志类<br /> */<br /> public Log logger = LogFactory.getLog(this.getClass());
/**<br /> * 方法<br /> */<br /> @Scheduled(cron = "${jobs.message}")<br /> public void send(){<br /> logger.info("start.....");<br /> <br /> }
}
@PropertySource 指定配置文件的位置,和配置文件的名称
@Scheduled 注解做相应的修改
- application.properties 文件配置
轮询时间配置
jobs.message=0/10 ?
这个定时任务时间配置和linux的crontab差不多
- Scheduled 参数1
@Scheduled(fixedDelay = 5000)
public void doSomething() {
// something that should execute periodically
}
这个方法将以一个固定延迟时间5秒钟调用一次执行,这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执行
当方法执行超过5秒,下一个轮询发现有正在执行的方法,直接跳过
- Scheduled 参数2
@Scheduled(fixedRate = 5000)
public void doSomething() {
// something that should execute periodically
}
这个方法将以一个固定速率5s来调用一次执行,这个周期是以上一个任务开始时间为基准,从上一任务开始执行后5s再次调用
当方法执行时间超过5秒,下一个轮询会阻塞,上一个任务执行完成,立即执行此次轮询方法
—————最后说明一下上面用到的注解问题———————-
TaskTime.java
@Component
public class TaskTime {
@Autowired
TaskGh taskGh;
@Scheduled(cron = “${tasktime.cron_gh}”)
public void taskGh() throws InterruptedException {
taskGh.getData();
}
}
applicationConfig.propertieswe文件中的 tasktime.cron_gh=0 24 14 ?
1.@PropertySource(“classpath:config/applicationConfig.properties“),可以读取到文件,如果文件不对,会提示错误,但@Scheduled(cron = “${tasktime.crongh}”) 或者 @Value(“${tasktime.cron_gh}”) 都不能获取到值,但是在controller中就可以,_TaskTime这个就是获取不到
2.最终解决:在springmvc的配置文件中设置该路径解决,property-placeholder location 多个文件逗号分隔
<!-- 配置数据源 --><br /> <bean name="dataSource_hbz" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><br /> <property name="url" value="${jdbc_url}"/><br /> <property name="username" value="${jdbc_username}"/><br /> <property name="password" value="${jdbc_password}"/>
<!-- 初始化连接大小 --><br /> <property name="initialSize" value="${initialSize}"/><br /> <!-- 连接池最大使用连接数量 --><br /> <property name="maxActive" value="${maxActive}"/><br /> <!-- 连接池最小空闲 --><br /> <property name="minIdle" value="${maxIdle}"/><br /> <!-- 获取连接最大等待时间 --><br /> <property name="maxWait" value="${maxWait}"/>
<br /> </bean>
——-springtask 修改 springmvc.xml
xsi:schemaLocation=”
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd”
default-init-method=”init”>