spring 框架下使用quartz 定時器

寫這篇文章的目的是:只要我需要使用定時器的時候可以 傻瓜式的 使用。本人喜歡使用xml的配置,所以沒有使用註解的方式。

1:要quartz 需要的jar包。特別說明:因爲我們在引入spring包的一般都是隻導入我們需要的jar包,所以很多時候我們缺少spring-context-support.jar包
                                <dependency>    
                                       <groupId>org.springframework</groupId>    
                                       <artifactId>spring-context-support</artifactId> 
                                       <version>3.2.4.RELEASE</version>
                              </dependency>
                                
commons-collections-3.2.jar  這個jar包一般都回有,檢查下就好。
2:在web中進行配置,確保我們的 定時器配置會被加載。 (注意紅色部分有個綠色的星號,這個就是要加載 只要是/spring-config開頭的xml文件
<listener>
        <description>Spring 核心配置</description>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:conf/spring/spring-config*.xml
        </param-value>
    </context-param>

3.定時器的配置


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:util="http://www.springframework.org/schema/util"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.2.xsd"
    default-autowire="byName">

<!-- 5分鐘掃描一次 -->
 <!-- 創建索引的業務類   用紅色表示出來是因爲這個  定時器的 類, 帶顏色的也就是自己需要許改的地方 -->
     <bean name = "sendOrderNum" class="com.message.service.impl.ShopOrderMessageService"></bean>
     <!-- 定義調用對象和調用對象的方法 -->
     <bean name="sendTelMessage" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
         <!-- 調用的類 -->
         <property name="targetObject">
             <ref bean="sendOrderNum"/>
         </property>
         <!-- 調用類中的方法 -->
         <property name="targetMethod">
             <value>sendTelMessage</value>
         </property>
     </bean>
      <!-- 定義觸發時間 -->
      <bean name="myTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
          <property name="jobDetail">
              <ref bean="sendTelMessage"/>
          </property>
          <!-- cron表達式  一個定時器可以有多個時間規則,這裏我沒用到 需要的話自己查看下   時間規則網上找起來很多-->
          <property name="cronExpression">
              <value>0 0/5 0-23 * * ?</value>
          </property>
      </bean>
      <!-- 總管理類 如果將lazy-init='false'那麼容器啓動就會執行調度程序    mytask name注意不要和其他的bean重名-->
      <bean name="mytask" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
          <property name="triggers">
              <list>
                  <ref bean="myTime"/>
              </list>
          </property>
      </bean>

    
</beans>
4.java 的實現類   當然根據自己的情況自己編寫功能了,順便看下@Resource 和  @Autowired的區別
 
@Resource 這個是通過 name屬性進行查找的。使用情況:如果一個接口有多個實現類,這個時候我們就需要用到這個
@Autowired  這個是通過類型進行查找的。使用情況:只有一個類實現了接口。因爲spring在啓動的時候對所有的對象都進行了加載,所以找實現類還是很快的。       (個人實踐認爲:如果只有一個實現類的話,用這兩個是沒有區別的!)
package com.message.service.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.common.utils.XmemcachedUtil;
import com.message.domain.ShopOrderMessage;
import com.message.service.IBuyTelphoneVerifyService;
import com.message.service.IMsgShopBuysService;
import com.message.service.IShopOrderMessageService;
import com.message.service.IShopOrdersService;


public class ShopOrderMessageService{
    @Resource
    private IShopOrderMessageService shopOrderMessageServiceImpl;
    @Autowired
    private IBuyTelphoneVerifyService buyTelphoneVerifyService;
    @Autowired
    private IShopOrdersService shopOrdersService;
    @Autowired
       private XmemcachedUtil xmemcachedUtil;
    @Autowired
    private IMsgShopBuysService shopBuysService;
    Logger logger = Logger.getLogger(this.getClass());
    public void sendTelMessage(){
        try {
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("yesOrNo", "0");
            //查詢出需要發送消息的集合
            List<ShopOrderMessage> list = shopOrderMessageServiceImpl.selectByParams(map);
            
            //測試結束後需要改的地方 : 數據配置
            //<![CDATA[AND UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(LAST_SEND_MSG_TIME) >= SHOP_SPACE_TIME * 5 * 60 ]]> 
            for(int i = 0;i < list.size();i++){
                ShopOrderMessage s = list.get(i);
                String shopId = s.getShopId();
                int spaceTime = Integer.parseInt(s.getShopSpaceTime()) * 60;
                int orderNum = shopOrdersService.selectOrderNum
                        (shopId,spaceTime,s.getLastSendMsgTime());
                String context = "";
                int buysNum = shopBuysService.selectBuysNum(shopId, spaceTime,s.getLastSendMsgTime());
                if(orderNum != 0 && buysNum == 0){
                    context = "提醒:您有"+orderNum+"個新訂單!";
                }else if(orderNum == 0 && buysNum != 0){
                    context = "提醒:您有"+buysNum+"個新的零售商申請!";
                }else if(orderNum != 0 && buysNum != 0){
                    context = "提醒:您有"+orderNum+"個新訂單和"+buysNum+"個新的零售商申請!";
                }
                
                if(context.length() > 1){
                    buyTelphoneVerifyService.smsInfo(null,context,s.getTel());
                }
                
                s.setLastSendMsgTime(new Date());
                shopOrderMessageServiceImpl.update(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章