解決Spring的定時器如何獲取項目的部署路徑

最近在寫項目的時候遇到在Spring的定時器下需要用到項目路徑的,但是在定時器中,沒法獲取request或者session不能直接調用他的方法直接獲得,那麼怎麼解決這樣的問題呢?其實還是有辦法的,正所謂條條道路通羅馬,spring這麼強大怎麼可能被這點小事給整過去.

我舉個例子吧,加入我們需要些這麼個定時器,他的需求如下:每天進行一次項目生成的一次性的文件進行刪除

那麼定時器代碼如下:

package com.smartsoft.quartz;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.smartsoft.common.Constant;
import com.smartsoft.service.UserService;

@Component
public class AnnotationQuartz {
	@Autowired
	UserService UserService;

	@Scheduled(cron = "0 0 0/1 * * ?")
	public void test() {
		int days = 2;
		// TODO定時刪文件
		SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
		Date date = new Date();
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		for (int i = 1; i <= 30; i++) {
			calendar.add(calendar.DATE, -1);
			date = calendar.getTime();
			String dateStr = sf.format(date);
			String docx_Report = Constant.get_REALPATH() +"templetUpload\\" + dateStr+"\\docx_Report";
			String html_Report= Constant.get_REALPATH() +"templetUpload\\" + dateStr+"\\html_Report";
			String pdf_Report= Constant.get_REALPATH() +"templetUpload\\" + dateStr+"\\pdf_Report";
			String xlsx_Report= Constant.get_REALPATH() +"templetUpload\\" + dateStr+"\\xlsx_Report";
			delFolder(docx_Report);
			delFolder(html_Report);
			delFolder(pdf_Report);
			delFolder(xlsx_Report);
		}
	}

	// 删除文件夹
	// param folderPath 文件夹完整绝对路径

	public static void delFolder(String folderPath) {
		try {
			delAllFile(folderPath); // 删除完里面所有内容
			String filePath = folderPath;
			filePath = filePath.toString();
			java.io.File myFilePath = new java.io.File(filePath);
			myFilePath.delete(); // 删除空文件夹
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 删除指定文件夹下所有文件
	// param path 文件夹完整绝对路径
	public static boolean delAllFile(String path) {
		boolean flag = false;
		File file = new File(path);
		if (!file.exists()) {
			return flag;
		}
		if (!file.isDirectory()) {
			return flag;
		}
		String[] tempList = file.list();
		File temp = null;
		for (int i = 0; i < tempList.length; i++) {
			if (path.endsWith(File.separator)) {
				temp = new File(path + tempList[i]);
			} else {
				temp = new File(path + File.separator + tempList[i]);
			}
			if (temp.isFile()) {
				temp.delete();
			}
			if (temp.isDirectory()) {
				delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
				delFolder(path + "/" + tempList[i]);// 再删除空文件夹
				flag = true;
			}
		}
		return flag;
	}

	public static void main(String[] args) {
		System.out.println(AnnotationQuartz.class.getResource("/"));
	}

}

以上代碼很簡單,就是純粹的刪除文件和文件夾,既然是刪除文件,那文件在項目的路徑就必須知道,這項目路徑如何來?看一下代碼

首先,新建一个类如下:

public class InitialServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("开始intitServlet");
        String realPath = getServletContext().getRealPath("/");
        Constant.set_REALPATH(realPath);
    }
}

用语获取项目路径并把它保存在Constant的常量里

public class Constant {
	public final static int PAGE_SIZE_10 = 10; //初始化分页

    // 项目路径,可以使用单例进行存放
    public static String _REALPATH = "";

    public static String get_REALPATH() {
        return _REALPATH;
    }
    public static void set_REALPATH(String _REALPATH) {
        Constant._REALPATH = _REALPATH;
    }
}

特殊一点,给他提供下get,set

重点是让InitialServlet在项目已启动就保存项目的路径所提,在web.xml定义这么一段初始化

<servlet>
		<servlet-name>InitialServlet</servlet-name>
		<servlet-class>com.smartsoft.util.InitialServlet</servlet-class>
		<load-on-startup>0</load-on-startup>
	</servlet>

这样一来,无论项目何时启动,在何时我们都能通过Constant.get_REALPATH()获取项目路径了,这里利用到的只是servlet的一些小知识而已,不懂的请先了解servlet吧

时间: 2024-10-10 20:30:03

解決Spring的定時器如何獲取項目的部署路徑的相关文章

COB Epoxy灌膠時氣泡產生的原因與解決方法

COB的黑膠 (Epoxy)有氣泡通常是不被允許的,因為外部氣孔不但會影響到外觀,內部氣孔更有可能會破壞 Wire bonding 的鋁線穩定度.既使在COB製程剛完成的時候沒有通過功能測試,也不代表沒有問題,因為在使用一段時間之後,極有可能會因為氣孔內空氣的熱脹冷縮的作用而扯斷鋁線(Al wire):另外內部氣孔也可能會積存水氣,久而久之造成零件內部線路氧化影響功能. 黑膠會產生氣泡的原因很多,解決的方法也不一定,先從黑膠可能產生氣泡的原因說起好了.黑膠本身不太會產生氣體,所以氣孔的形成一般有

SAMETIMESでチャートする時ウィンドウを出るの解決策

→ SAMETIMESでチャートする時ウィンドウを出るの解決策

[SharePoint 2010]Sandboxed Solution (沙箱解決方案)

現有的SharePoint 2007系統中,我們如果要安裝客製化的程式碼到系統中,我們必須製作一個解決方案包裝檔(Solution Package),然後在系統的中央管理後台中,真對整個伺服器農場Farm發佈出去. 使用解決方案包裝檔(Solution Package)的好處是在一個多台伺服器的環境中可以一次性將客製化程式碼發佈出去. 然而, 現有的解決方案包裝檔可以存取每一台伺服器上的資源,而且我們為了方便通常會給予很高的執行權限或者是將它部屬到Global Assembly Cache中.

CKEditor4 自動清除內容標籤問題的解決方法

在CKEditor中我們經由配置檔Config.js,可以依照自己的需求去自定編輯器的工具,如下圖: 而在CKEditor中CKEDITOR.editor.filter會過濾掉一些沒開放功能的內容,舉例來說:上面這編輯器並沒有開放iframe這功能,但倘若我想要貼上youtube分享的嵌入連結,就是由方式嵌入的,youtube嵌入的Code如下:&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&

DevExpress的GridControl控件更新數據問題解決辦法

開發WPF程序時,使用Devexpress的GridControl控件用ItemSource綁定數據,在頁面進行編輯時,當屬性繼承INotifyPropertyChanged接口時會同步更新後臺數據.今天在開發時遇到一種情況,當通過GridControl中Row上Button[Command]改變行內數據,也就是binding的Detail數據已改變,這時NotifyPropertyChanged有觸發,但改變的行數據不會同步更新到UI上,目前測試有兩種方式進行解決. 1.直接new 一個新的行

如何解決 Homebrew Update 失敗?

相信許多用 MAC 系統的程式設計師.工程師們都有用 Homebrew 這個超好用的 Open Source 套件管理程式吧? 如果沒有的話,你可以透過以下的指令安裝: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 不過今天不是要來介紹如何使用 Homebrew 的,而是要跟大家分享一下我怎麼解決無法 Update 的問題... 某天我要更新 Homeb

關於php接ICBC的支付接口的解決方案

一:背景: 目前項目使用的是php語言開發,需要接入中國工商銀行的ICBC的線上支付接口. 二:遇到的問題:支付時需要對數據簽名,但是銀行那邊不提供php版本的程序,只有java版本的,以下是對接人回復的郵件: 三:思路: 目前大概有3種解決方案: 1.  通過使用一個叫 php-java-bridge 的插件,在php中調用java的函數 2. 把java的函數改寫成php版本 3. 在服務器配置javaWeb環境,通過http請求把簽名的參數傳入,從而獲取簽名 四: 具體做法: 我採取的是第

Oracle12c client安裝報錯[INS-20802] Oracle Net Configuration Assistant failed完美解決

Doc ID 2082662.1 1.錯誤碼 Installation Of Oracle Client 12.1.0.2.0 (32-bit) Fails With An Error Message "[INS-20802] Oracle Net Configuration Assistant failed 2.問題描述 在window 7安裝Oracle Client12C的時候遇到INS-20802 Oracle Net Configuration Assistant失敗的問題,百度了很多

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.