程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Quartz定時任務使用小記(11月22日),quartz小記

Quartz定時任務使用小記(11月22日),quartz小記

編輯:JAVA綜合教程

Quartz定時任務使用小記(11月22日),quartz小記


驟然接觸quartz,先從小處著手,why,what,how

quartz定時任務:

  為什麼使用quartz定時任務,以及定時任務在實際應用場景下的特定需求。

  1.用戶方面的需要,為了提供更好的使用體驗,例如,針對用戶注冊的監聽,最終得到用戶使用一定階段各種提醒、互動方面的業務使用,以及針對用戶生日的監聽及定時任務的設置

  2.數據更新的需要,針對公司日終報表的設計,這裡就涉及今日的主題,數據庫相關存儲過程的調用。存儲過程是可執行的代碼塊,效率相對java後台代碼效率要高,尤其是針對查詢時,選用存儲過程做邏輯判斷。在12306網站數據管理中,網購車票預留幾個小時進行數據的更新,一些專門數據庫表數據的填充與更新。

  3.業務方面的需要,這裡涉及工作中的實際需求,針對業務層的特定方法給以定時任務設置,尤其是在物流系統中,相關逾期的提醒,金融證券系統中,各種日終的運算等。

  

  什麼是quartz:

  Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標准的Java組件或 EJBs。

  Quartz對任務調度的領域問題進行了高度的抽象,提出了調度器、任務和觸發器這3個核心的概念,跟精細的描述調度器、任務和觸發器,跟精准的完成任務的調度。

  Quartz是一個完全由java編寫的開源作業調度框架。核心是調度器,調度器負責管理Quartz應用運行時環境。Quartz采用了基於多線程的架構。啟動時,框架初始化一套worker線程,這套線程被調度器用來執行預定的作業。這就是Quartz怎樣能並發運行多個作業的原理。Quartz依賴一套松耦合的線程池管理部件來管理線程環境,而且Quartz裡面的每個對象是可配置的或者是可定制的。

  調度器、任務和觸發器簡介

  ==Job與Trigger是一對一的關系,Scheduler與Trigger是一對多的關系。

  調度器:調度器用於將與作業觸發器關聯,一個作業可關聯多個觸發器,這樣每個觸發器被可以觸發的作業執行;一個觸發器可用於控制多個作業,觸發時全部作業將獲得調度。Quartz的調度器由Scheduler接口體現。
  作業:只需實現org.quartz.job接口即可.Job接口包含一個方法 execute(),execute方法體是被調度的作業體。一旦實現Job接口和execute()方法,
  Quartz確定作業運作的時候,它將調用 execute()方法體。
  觸發器:有SimpleTrigger和CronTrigger兩種類型
    1.每隔指定時間則觸發一次,對應的調度器為org.springframework.scheduling.quartz.SimpleTriggerBean
    2.每到指定時間則觸發一次,對應的調度器為org.springframework.scheduling.quartz.CronTriggerBean

     

  案例demo參考:http://blog.csdn.net/wangguanyin98/article/details/50977764

spring與Quartz的整合 

   資源參考:http://stevex.blog.51cto.com/4300375/1351980

   Spring配置調度器 schedule,作業 job,觸發器 trigger的實例:

  

A.實際開發中的應用,applicationContext.xml即spring主配置文件中的配置:

<!-- ************************************定時執行任務區*************************************** -->
<!-- quartz線程池配置 -->
<bean id="executor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>

<!-- 更新申請狀態 -->
<bean id="jdApplyStatusJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jdSftpService" />
<property name="targetMethod" value="updateApplyStatus" />
</bean>
<!-- 更新放款狀態 -->
<bean id="jdLoanStatusJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jdSftpService" />
<property name="targetMethod" value="updateLoanStatus" />
</bean>

<!-- 定時計算罰息 -->
<bean id="payCaculateServiceJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="payCaculateService" />
<property name="targetMethod" value="settlementCaculate" />
</bean>

<!-- 設置更新申請狀態的觸發器 -->
<bean id="jdApplyStatusCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jdApplyStatusJobTask" />
<property name="cronExpression" value="0 25 10 * * ?" />
</bean>

<!-- 設置更新放款狀態的觸發器 -->
<bean id="jdLoanStatusCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jdLoanStatusJobTask" />
<property name="cronExpression" value="0 25 10 * * ?" />
</bean>

<!-- 設置計算罰息的觸發器 -->
<bean id="payCaculateServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="payCaculateServiceJobTask" />
<property name="cronExpression" value="0 41 17 * * ?" />
</bean>

<!-- 發送還款流水Job -->
<bean id="deductServiceJobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="deductService" />
<property name="targetMethod" value="repaymentDetail" />
</bean>

<!-- 還款流水發送Trigger -->
<bean id="deductServiceJobTaskCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="deductServiceJobTask" />
<property name="cronExpression" value="0 12 17 * * ?" />
</bean>


<!-- 調度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="jdApplyStatusCronTrigger" />
<ref bean="jdLoanStatusCronTrigger" />
<!-- <ref bean="payCaculateServiceCronTrigger" />
<ref bean="deductServiceJobTaskCronTrigger" />-->
</list>
</property>
<property name="taskExecutor" ref="executor" />
</bean>

B.Quartz定時任務,service的編寫

@Service("payCaculateService")

public class PayCaculateService {
@Resource(name = "daoSupport")
private DaoSupport dao;
/*
* 根據合同號獲取還款流水
*/
public List<PageData> getPayLslistPage(Page page) throws Exception {
return (List<PageData>) dao.findForList("PayCaculateMapper.getPayLslistPage",page);

}
/*
* 入賬計算
*/
public String payCaculate(PageData pd) throws Exception {
try {
dao.findForObject("PayCaculateMapper.proPayCaculate",pd);
return "1";
} catch (Exception e) {
e.printStackTrace();
}
return "0";
}
/**
* 結息(罰息)定時計算
* @param pd
* @return
* @throws Exception
*/
public String settlementCaculate() throws Exception {
java.text.DateFormat format2 = new java.text.SimpleDateFormat("yyyy-MM-dd");
String sd= format2.format(new java.util.Date());
PageData pd=new PageData();
pd.put("settlement_date", sd);
dao.findForObject("PayCaculateMapper.settlementCaculate",pd);
return "1";
}

}

C.基於反射機制,對於mapper中制定id的 my sql存儲過程的調用

<select id="batchCaculate" statementType="CALLABLE" parameterType="pd" resultType="pd">
<![CDATA[
{call js_batch_repay()}
]]>
</select>

<select id="oneCaculate" statementType="CALLABLE" parameterType="pd" resultType="pd">
<![CDATA[
{call js_one_repay(#{sub_contract_no},#{period})}
]]>
</select>

<select id="settlementCaculate" statementType="CALLABLE" parameterType="pd" resultType="pd">
<![CDATA[
{call js_settlement(#{settlement_date})}
]]>
</select>

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved