定时清理临时文件

Quartz定时任务
package com.util.quartz;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.commons.io.FileUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class DeleteTempJob implements Job {

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub

// 获得jobDetail传过来的参数
Map<String, Object> map = context.getJobDetail().getJobDataMap();
ServletContext servletContext = (ServletContext) map.get("servletContext");
String reportTemplatePath = servletContext.getRealPath("/resource") + System.getProperty("file.separator");
reportTemplatePath = reportTemplatePath.replace('\\', '/');

String dir = reportTemplatePath.substring(0, reportTemplatePath.indexOf("/resource")) + "/resource/expertTemp/";

File file = new File(dir);
try {
if (file.exists() && file.isDirectory()) {
// Cleans a directory without deleting it.
FileUtils.cleanDirectory(file);
}
} catch (IOException e) {
e.printStackTrace();
}
}

}


----------------------------------------------------------------------
package com.util.quartz;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;

import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerUtils;

@SuppressWarnings("deprecation")
public class QuartzTrigger extends org.quartz.ee.servlet.QuartzInitializerServlet {

private static final long serialVersionUID = 1L;

/**
* 初始化
*
* @param ServletConfig cfg
* @return
*/
public void init(ServletConfig cfg) throws javax.servlet.ServletException {
super.init(cfg);
run(cfg);
}

/**
* 创建一个调度器<code>Scheduler<code>的实例。
* 实例化一个监控定制报表表的线程,并启动该线程。
*
* @param ServletConfig cfg
* @return
*/
public void run(ServletConfig cfg) {
ServletContext servletContext = cfg.getServletContext();
SchedulerFactory factory = (SchedulerFactory) cfg.getServletContext().getAttribute(QUARTZ_FACTORY_KEY);
Scheduler sched;
try {
sched = factory.getScheduler();
sched.start();
JobDetail jobDetail = new JobDetail("deleteTempFile", Scheduler.DEFAULT_GROUP, DeleteTempJob.class);
// 将ServletContext对象放到map中,然后从job中取出来,从而取得路径
Map<String, Object> map = new HashMap<String, Object>();
map.put("servletContext", servletContext);
JobDataMap dateMap = new JobDataMap(map);
jobDetail.setJobDataMap(dateMap);

// fire at the first day 02:01 in every month, start right now
Trigger trigger = TriggerUtils.makeDailyTrigger("deleteTempFile", 02, 01);

sched.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}


-------------------------------------------------------------------
<servlet <description>Quartz定时器,定时清理指定文件夹的临时文件</description>
<servlet-name>DeleteTempJobServlet</servlet-name>
<display-name>DeleteTempJobServlet</display-name>
<servlet-class>com...util.quartz.QuartzTrigger</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>


==============================================================================================================
发现QuartzInitializerServlet 已过时,解决重新写了run方法,init方法去掉
public void run(ServletConfig cfg) {
ServletContext servletContext = cfg.getServletContext();
Scheduler scheduler;
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
JobDetail jobDetail = new JobDetail("deleteTempFile", Scheduler.DEFAULT_GROUP, DeleteTempJob.class);
// 将ServletContext对象放到map中,然后从job中取出来,从而取得路径
Map<String, Object> map = new HashMap<String, Object>();
map.put("servletContext", servletContext);
JobDataMap dateMap = new JobDataMap(map);
jobDetail.setJobDataMap(dateMap);

// fire at the first day 02:01 in every month, start right now
Trigger trigger = TriggerUtils.makeDailyTrigger("deleteTempFile", 02, 01);

scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
在数据库中实现定时清理临时文件的功能,通常可以通过编写存储过程并结合数据库的定时任务调度功能来完成。不同的数据库系统提供了不同的机制来支持定时任务。以下将以 **MySQL** 和 **PostgreSQL** 为例,说明如何配置和实现扫库定时任务以定期删除临时文件。 ### MySQL 中的定时任务 MySQL 提供了 **事件调度器(Event Scheduler)** 来支持定时执行 SQL 语句或调用存储过程。 #### 步骤一:创建用于清理临时文件的表 假设有一个临时文件表 `temp_files`,其中包含一个字段 `created_at` 表示文件的创建时间: ```sql CREATE TABLE temp_files ( id INT AUTO_INCREMENT PRIMARY KEY, file_path VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` #### 步骤二:创建存储过程用于清理过期数据 定义一个存储过程 `cleanup_temp_files`,用于删除超过一定时间的临时文件(例如超过 24 小时): ```sql DELIMITER // CREATE PROCEDURE cleanup_temp_files() BEGIN DELETE FROM temp_files WHERE created_at < NOW() - INTERVAL 1 DAY; END // DELIMITER ; ``` #### 步骤三:创建事件调度器 启用事件调度器并创建一个每天执行一次的事件: ```sql -- 启用事件调度器 SET GLOBAL event_scheduler = ON; -- 创建事件 CREATE EVENT IF NOT EXISTS daily_cleanup ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP DO CALL cleanup_temp_files(); ``` ### PostgreSQL 中的定时任务 PostgreSQL 没有内置的事件调度器,但可以通过外部工具如 **cron** 或使用扩展 **pgAgent** 来实现定时任务。 #### 方法一:使用 cron 调用 SQL 脚本 创建一个 SQL 文件 `cleanup.sql`,内容如下: ```sql DELETE FROM temp_files WHERE created_at < NOW() - INTERVAL '1 day'; ``` 然后在 Linux 系统中编辑 crontab 文件,添加一行定时任务: ```bash 0 0 * * * psql -U your_user -d your_database -f /path/to/cleanup.sql ``` 这将每天凌晨 0 点执行清理操作。 #### 方法二:使用 pgAgent(适用于图形化管理) 安装并配置 pgAgent 扩展后,可以在 pgAdmin 中创建作业,设置调度计划,并指定要执行的 SQL 命令。 ### 总结 通过上述方法,可以实现在不同数据库系统中定时清理临时文件的功能。MySQL 使用事件调度器直接支持定时任务,而 PostgreSQL 则依赖外部工具或扩展来完成类似功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值