1. 程式人生 > >springmvc框架定時器功能實現和service注入問題解決

springmvc框架定時器功能實現和service注入問題解決

1、在SpringMVC配置檔案中新增

xmlns:task="http://www.springframework.org/schema/task" 
http://www.springframework.org/schema/task  
http://www.springframework.org/schema/task/spring-task-3.2.xsd 

配置任務掃描

<task:annotation-driven />

配置掃描任務位置

<!-- 掃描任務 -->
    <context:component-scan base-package="com.vrveis.roundTrip.task" />

2、如果定時器方法單獨寫在一個工具類裡,沒有配置掃描該資料夾,注入service就會失敗,可以通過SpringContextUtil類呼叫

具體程式碼如下:

package com.test.controller.base;
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 在Spring 註解中,普通類獲取@Service標記的方法或者bean物件
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static Logger logger = Logger.getLogger(SpringContextUtil.class);
    private static ApplicationContext applicationContext = null;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
    {
        logger.info("------SpringContextUtil setApplicationContext-------");
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 注意 bean name預設 = 類名(首字母小寫)
     * 例如: A8sClusterDao = getBean("a8sClusterDao")
     * @param name
     * @return
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }

    /**
     * 根據類名獲取到bean
     * @param <T>
     * @param clazz
     * @return
     * @throws BeansException
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBeanByName(Class<T> clazz) throws BeansException {
        try {
            char[] cs=clazz.getSimpleName().toCharArray();
            cs[0] += 32;//首字母大寫到小寫
            return (T) applicationContext.getBean(String.valueOf(cs));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } 
    }

    public static boolean containsBean(String name) {
        return applicationContext.containsBean(name);
    }

    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.isSingleton(name);
    }

}
呼叫方法:
//獲取 Bean  注意bean的首字母小寫
   RcpqService rcpqService=(RcpqService) SpringContextUtil.getBean("rcpqService");

3、利用監聽器,實現定時器功能:

在web.xml中設定監聽器:

<listener>
    <listener-class>com.test.listener.MyTimerTaskListener</listener-class>
  </listener>

監聽器程式碼如下:

package com.test.listener;

import java.util.Calendar;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.test.util.MyTimerTask;
/**
 * @author snwei
 */
public class MyTimerTaskListener implements ServletContextListener {
    private Timer timer = null;
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        timer.cancel();
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("-----開始啟動定時器------");
        Calendar firstStart = Calendar.getInstance();
        firstStart.set(Calendar.HOUR_OF_DAY, 0);
        firstStart.set(Calendar.MINUTE, 10);
        firstStart.set(Calendar.SECOND, 0);
        timer = new Timer(true);
        //第一次是凌晨0:10:00執行,間隔24小時執行一次
        timer.schedule(new MyTimerTask(), firstStart.getTime(), 1000*60*60*24);
        
        //timer.scheduleAtFixedRate(task, delay, intevalPeriod);//嚴格按照排程時間來的,時間不會順延
    	//timer.schedule(task, new Date(), intevalPeriod);//如果某一次排程時間比較長,那麼後面的時間會順延,保證排程間隔
        //timer.scheduleAtFixedRate(new MyTimerTask(), 0, 1000*60*10);  //測試
    }
}
定時器業務程式碼如下:
package com.test.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimerTask;
import com.test.controller.base.SpringContextUtil;
import com.test.service.manager.rcpq.RcpqService;
/**
 * 定時器
 */
public class MyTimerTask extends TimerTask{
    @Override
    public void run() {
    	//獲取 Bean
    	RcpqService rcpqService=(RcpqService) SpringContextUtil.getBean("rcpqService");
	//呼叫service方法,業務程式碼實現
	...
    }
}

相關推薦

springmvc框架定時功能實現service注入問題解決

1、在SpringMVC配置檔案中新增 xmlns:task="http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.spri

STM32通用定時的基本定時功能實現燈閃爍

/*MAIN.C*/ /* Includes ------------------------------------------------------------------*/#inclu

springMVC框架網頁下載功能實現

List<Map<String,Object>> list=selectData();//到資料庫中查詢需要匯出的資訊HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet("匯出資訊"

SpringMVC註解定時的配置時間設定

首先,在springMVC的註解配置檔案即啟動servelet會讀取的xml配置檔案中新增定時器的規範 xmlns:task="http://www.springframework.org/schema/task" 和 http://www.springfram

不用寫Windows服務實現定時功能(FluentScheduler )

ace 簡單 要去 job macbook sharp 管理 dia 做到 MacBook Pro 只有四個 USB Type-C 接口是否錯了? 一項新技術的誕生總會對已存在的事物造成沖擊或影響,如果大家都害怕沖擊與影響,那這個世界永遠像現在不變就行了,大家都好好的,待

PHP 使用do while 實現定時功能

<?php require "./config.php"; require "./function/function.php"; header("content-type:text/html;charset=utf-8"); ignore_user_abort();//關閉瀏覽器仍然

在dll裡實現定時功能

一,首先引入“mmsystem”單元。二,啟動定時器:     var        MMTimerID: Integer; // 定時器ID        MMTimerID := timeSetEvent(1000, 0, @TimerProc, 0, TIME_PERI

Linux C/C++定時實現原理使用方法

定時器的實現原理 定時器的實現依賴的是CPU時鐘中斷,時鐘中斷的精度就決定定時器精度的極限。一個時鐘中斷源如何實現多個定時器呢?對於核心,簡單來說就是用特定的資料結構管理眾多的定時器,在時鐘中斷處理中判斷哪些定時器超時,然後執行超時處理動作。而使用者空間程式不

SpringMVC定時繼承Task後無法對service注入問題

edisTask是通過定時器來每分鐘像資料庫裡推送的,於是就有了 public class RedisTask extends Task { public void execute(TaskExecutionContext executor) throws

實現定時功能的幾種方式

nsrunLoop GCD RAC NsrunLoop NSRunLoop是IOS訊息機制的處理模式 一條執行緒對應一個RunLoop,主執行緒的RunLoop預設已經建立好了, 而子執行緒的需要我們自己手動

定時查詢法定時中斷法實現LED閃爍

1、定時器查詢法實現LED閃爍 ;2013/4/23 ;延時1s閃爍 org 0000h ajmp start org 30h

定時實現、java定時TimerQuartz介紹與Spring中定時的配置

欄位 允許值 允許的特殊字元    秒 0-59 , - * /    分 0-59 , - * /    小時 0-23 , - * /    日期 1-31 , - * ? / L W C    月份 1-12 或者 JAN-DEC , - * /    星期 1-7 或者 SUN-SAT , - *

C# System.Timers.Timer定時的使用定時自動清理內存應用

for process work proc program 指定時間 handle 清理 interval 項目比較大有時候會比較卡,雖然有GC自動清理機制,但是還是有不盡人意的地方。所以嘗試在項目啟動文件中,手動寫了一個定時器,定時清理內存,加快項目運行速度。 pub

js--定時的學習對動畫的封裝(定時

定時器 回調 .get floor val logs 多個 get math 1.定時器:在js裏面,定時器主要有兩種,setInterval(function, time) 和 setTimeout(function,time), setInterval:每個time秒執

N76E003的定時/計數器 01

時鐘周期 14. 波特率 翻轉 離開 kcon In IV 進行 定時器/計數器 0和1N76E003系列定時器/計數器 0和1是2個16位定時器/計數器。每個都是由兩個8位的寄存器組成的16位計數寄存器。 對於定時器/計數器0,高8位寄存器是TH0、 低8位寄存器是TL0

Spring 定時schedule實現

執行 掃描 clearing process obj after ice wait code 註解方式: 核心類摘要: 1.ScheduledAnnotationBeanPostProcessor 2.ScheduledTaskRegistrar 3.TaskSchedul

微信小程序學習Course 7 定時功能

換算 ava 而且 tint 毫秒 src ole 時間 技術 微信小程序學習Course 7 定時器功能 微信小程序中有一個定時器API函數,其提供了四個API接口 7.1、number setTimeout(function callback, number

linux定時實現方法

this 就是 沒有 讀取數據 entry arm sigalrm read time Linux提供定時器機制,可以指定在未來的某個時刻發生某個事件,定時器的結構如下: struct timer_list { struct list_head list;

MySQL觸發器與定時的介紹錯誤處理

MySQL觸發器與定時器的介紹和錯誤處理方法 最近在做一個東南亞的海外專案,整個專案的技術架構是由我負責,由於專案比較龐大,涉及三種語言,資料關係比較複雜,用的觸發器、定時器比較多。借這個新型大專案,也重溫了了很久沒有接觸的觸發器(TRIGGER)、定時器(EVENT),本文也是回憶結合

springMVC檢視解析的配置使用

在spring-servlet.xml中配置檢視解析器 <!-- 配置檢視解析器 -->    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"