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()使線程阻塞,然後規律喚醒線程執行任務從而達到定時執行任務的目的,這個方法目前我還沒用到,後續用到的話,再給大家更新吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章