最近公司不是很忙,突然想到csdn上我还没有写过东西。。闲来无聊就把公司最近接触到的新东西打算写出来
ok,废话不多说,进入正题。java定时任务的使用。
如果查询一段数据,耗时比较长的话,我们可以把查出来的数据放入缓存数据库(redis之类的),这样固然可以让效率变高,但是如果数据更新或是变动后,为了保证数据的正确性,我们还是要耗时重新从数据库查询的。这里我们其实可以用到java的定时任务的办法来解决,让程序自己隔一段时间从数据库查一次然后放入缓存库中,这样就只有第一次需要耗费些时间从数据库查询了,以后都可以让定时任务自己执行查询任务放入缓存库,从而 从缓存库得到数据,进而节省不少数据的查询时间了,不过具体怎么玩呢,看下面吧:
一:首先,你需要自己写好自己需要的实现类(即需要定时执行的方法),然后,再写一个QuartzJob类:
@Component
public class QuartzJob {
@Reference(protocol = "dubbo", version = "1.0.0", group = "user")
@Autowired
ProductService productService;
// 具体的定时任务实现
public void putSelectUnderRate (){
ProductVO pvo = new ProductVO();
System.out.println( " 定時任務 ");
pvo.setAll(100);
pvo.setPageSize(20);
productService.selectUnderRate(pvo);
}
}
二:然后,可以看到,在这个类里,有一个service,这个接口就是我们需要定时执行的任务,这其实只是一个普通的类,还需要在配置文件里进行配置才可以实现定时任务的执行。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 最热产品(逻辑分页把数据存入redis) -->
<bean id="quartzJob" class="com.weidian.cms.quartz.QuartzJob" /> <!-- class 对应的地址即为上面提供的任务类 id 和下面的引用对应-->
<!-- 下架率 -->
<bean id="UnderRatelimit" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="quartzJob" />
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>putSelectUnderRate</value>
</property>
</bean>
<bean id="UnderRatelimitTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="UnderRatelimit" />
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>0 10,20,30,40,50 * * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="UnderRatelimitTime"/>
</list>
</property>
</bean>
</beans>
三:再在项目的web.xml里进行配置 文件地址和类加载监听器:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml,classpath:spring-mybatis.xml</param-value> //注意,我的定时器的配置写在了spring.xml里
</context-param>
<listener>
<description>spring监听器</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
然后按着我上面的配置,注意,不同的bean和id 要一一对应,相互引用不要搞错了,然后在配置 UnderRatelimitTime里的<value>0 10,20,30,40,50 * * * ?</value>的是一段定时任务的表达时,这里这个value的意思是每小时的 0,10,20,30,40,50 分钟任务都会自己跑一次, 其他的怎么写 大家可以自行百度。
好了,这就是java用配置文件的方式写定时任务的方法了,第一次写,写的比较粗糙,有什么错误或是不足的地方,希望大家谅解和指出,谢谢。
另外,我前段时间在博客也看到另一种定时任务实现的方法,就是用线程,调用线程的 sleep()使线程阻塞,然后规律唤醒线程执行任务从而达到定时执行任务的目的,这个方法目前我还没用到,后续用到的话,再给大家更新吧。