java定时任务的使用

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


猜你喜欢

转载自blog.csdn.net/summeryesky/article/details/80563781