最近公司不是很忙,突然想到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()使线程阻塞,然后规律唤醒线程执行任务从而达到定时执行任务的目的,这个方法目前我还没用到,后续用到的话,再给大家更新吧。