`
dongmingj
  • 浏览: 10063 次
文章分类
社区版块
存档分类
最新评论

异步导出excel表格(3)生成的excel定时删除

阅读更多

        当异步导出使用一段时间后,会出现大量的没有用的excel文件,占用大量系统硬盘空间,因此,异步excel表格处理还需要有定时删除一定时间前的数据功能。

        针对上面的问题,我采用quartz的CronTrigger触发方法,定时触发删除excel文件的任务。定时删除Job工作流程如下:




         job首先查询数据库里一定时间前的标记未删除结果文件的任务,然后通过File类去判断文件是否依然存在。如果存在,就删除文件。Job及配置代码如下:

public class AsynchronyExportDeleteJob extends QuartzJobBean implements Job {
	
	JdbcTemplate jdbcTemplate;
	
	String filePrefix;
	
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	public void setFilePrefix(String filePrefix) {
		this.filePrefix = filePrefix;
	}
	
	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		if(jdbcTemplate != null) {
			final String querySql = "select id, generate_excel_file_path from ht_table_asynchrony_export_job_params where is_delete_exported_file=0 and job_finish_time >= ?";
//			final String execSql = "update ht_table_asynchrony_export_job_params set is_delete_exported_file = 1 where job_finish_time >= ?";
			final String execSingleSql = "update ht_table_asynchrony_export_job_params set is_delete_exported_file = 1 where id=?";;
			jdbcTemplate.execute(new ConnectionCallback<Integer>() {

				@Override
				public Integer doInConnection(Connection connection)
						throws SQLException, DataAccessException {
					// get job field id, template_file_path of one month ago. 
					PreparedStatement pstmt = connection.prepareStatement(querySql);
					Calendar startCalendar = Calendar.getInstance();
					startCalendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
					startCalendar.add(Calendar.MONTH, -1);
					pstmt.setDate(1, new java.sql.Date(startCalendar.getTimeInMillis()), startCalendar);
					ResultSet rs = pstmt.executeQuery();
					Map<Integer, String> idAndPath = new HashMap<Integer, String>();
					try {
						while(rs.next()) {
							idAndPath.put(rs.getInt(1), rs.getString(2));
						}
					} catch(SQLException e) {
						e.printStackTrace();
						return null;
					}
					pstmt.close();
					// update pending job parameter record status.
//					pstmt = connection.prepareStatement(execSql);
//					pstmt.setDate(1, new java.sql.Date(startCalendar.getTimeInMillis()), startCalendar);
//					pstmt.executeUpdate();
//					pstmt.close();
					// deal with the temporary files.
					try {
						pstmt = connection.prepareStatement(execSingleSql);
						for(Entry<Integer, String> iap : idAndPath.entrySet()) {
							String filePath = filePrefix + iap.getValue();
							File file = new File(filePath);
							if(file.exists()) {
								if(file.delete()) {
									pstmt.setInt(1, iap.getKey());
									pstmt.executeUpdate();
								}
							} else {
								pstmt.setInt(1, iap.getKey());
								pstmt.executeUpdate();								
							}
						}
					} catch(NullPointerException e) {
						e.printStackTrace();
					} catch(SQLException e) {
						e.printStackTrace();
					} finally {
						pstmt.close();
					}
					return null;
				}
				
			});
		}
	}

}

         Job中数据库的访问方式,我采用jdbc方式,减少复杂度,提高效率。Job采用springMVC中的QuartzJobBean基类,通过注入方式,生成JobDetail。

         配置代码如下:

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="url">
			<value>jdbc:mysql://localhost:3306/hterp_130105?useUnicode=true&amp;characterEncoding=UTF-8
			</value>
		</property>
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="username" value="root"></property>
		<property name="password" value="root"></property>
	</bean>

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>

    <bean id="asynchronyExportDeleteJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    	<property name="jobClass">
    		<value>com.hetang.impl.job.asynchronyexport.AsynchronyExportDeleteJob</value>
    	</property>
    	<property name="jobDataAsMap">
    		<map>
    			<entry key="jdbcTemplate">
    				<ref bean="jdbcTemplate"/>
    			</entry>
    		</map>
    	</property>
    </bean>

        增加Job操作Service,并将Job添加到schedule中:

@Component
public class AsynchronyExportDeleteJobService {
	@Autowired
	@Qualifier("quartzScheduler")
	Scheduler scheduler;
	
	@Autowired
	@Qualifier("asynchronyExportDeleteJobDetail")
	JobDetail jobDetail;
	
	public void schedule() {
		CronTrigger trigger = new CronTrigger();
		trigger.setName("asynchronyExportDeleteTrigger");
		trigger.setGroup("asynchronyExportGroup");
		try {
			// set job execute at every 4:00 per day.
			trigger.setCronExpression("0 0 4 ? * *");
			trigger.getJobDataMap().put("filePrefix", Erp.contextPath + "export\\generate\\");
		} catch (java.text.ParseException e) {
			e.printStackTrace();
			return;
		}
		try {
			scheduler.scheduleJob(jobDetail, trigger);
		} catch(SchedulerException e) {
			e.printStackTrace();
			return;
		}
	}
}

         schedule采用springMVC中SchedulerFactoryBean产生。配置如下:

    <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
        <property name="configLocation" value="classpath:quartz.properties"/>
    </bean>

         至此,定时删除Job添加完毕。

  • 大小: 16.1 KB
分享到:
评论

相关推荐

    delphi从SQLSERVER数据库导出到EXCEL

    SQL SERVER是微软提供的一个强大关系型数据库管理系统,而Excel则是处理和分析表格数据的办公软件。 首先,我们需要理解Delphi如何与SQL SERVER交互。Delphi中通常会使用ADO(ActiveX Data Objects)组件来连接和...

    DataGrid等转换为word,excel报表专集

    将DataGrid的数据导出到Excel,可以方便地进行数据编辑、格式化和分析。这通常通过编程实现,例如使用C#或VB.NET,利用`Microsoft.Office.Interop.Excel`库来创建Excel工作簿,将DataGrid中的每一行数据写入对应的...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 mysql版本_spring3.0

    系统用户:对各个基本的组会员增删改查,单发、群发邮件短信,导入导出excel表格,批量删除 3. 会员管理:对前台用户管理,分配会员级别,到期时间,状态,联系信息等资料 4. 菜单管理:增删改查菜单 ztree(自定义...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 oracle版本_spring3.0

    系统用户:对各个基本的组会员增删改查,单发、群发邮件短信,导入导出excel表格,批量删除 3. 会员管理:对前台用户管理,分配会员级别,到期时间,状态,联系信息等资料 4. 菜单管理:增删改查菜单 ztree(自定义...

    基于ssm的宿舍管理系统的实现源码

    开发者需要编写代码读取数据库数据,然后利用POI API将数据填充到Excel表格中,生成可供下载的文件。 除此之外,系统的设计和实现还涉及前端界面的构建。可能采用了Bootstrap或Vue.js等前端框架,提供了友好的用户...

    Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统

    Bootstrap-Export(各种报表导出SQL,Excel,pdf等)框架,整合Echars,各类图表的展示(折线图,饼图,直方图等),使用了layui的弹出层、菜单、文件上传、富文本编辑、日历、选项卡、数据表格等 Oracle关系型...

    Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统.rar

    用Redis做中间缓存,缓存数据 实现异步处理,定时任务,整合Quartz Job以及Spring Task 邮件管理功能, 整合spring-boot-starter-mail发送邮件等, 数据源:druid 用户管理,菜单管理,角色管理,代码生成 ...

    ORACLE REPORT高级开发教程

    3. 报表布局:Oracle Report支持多种布局设计,如表格、图表、文本块等。开发者可以通过拖放方式调整元素位置,设置单元格样式、边框、对齐方式等。 4. 样式和主题:Report提供了丰富的样式和主题选择,可以自定义...

    ASP.net报表系统

    8. **报表服务**:Microsoft的SQL Server Reporting Services (SSRS) 是一个全面的报表解决方案,它可以与ASP.NET集成,提供更高级的功能,如定时报表生成、订阅、安全管理和部署。 9. **性能优化**:对于大数据量...

    plsql 中文使用手册

    - 将查询结果导出为 CSV、Excel 或其他格式。 8. **保存 SQL 脚本** - 将 SQL 语句保存为文件,方便日后重用。 #### 七、命令窗口 1. **输入 SQL 语句和命令** - 支持直接在命令窗口中执行 SQL 语句和其他命令。...

    PLSQL Developer 7.0 用户指南

    - 可以将 SQL 查询的结果直接导出为 CSV、Excel 等格式的文件。 - 便于与其他应用程序共享数据。 ##### 6.9 保存 SQL 脚本 - 支持将 SQL 语句保存为脚本文件。 - 方便后续重复使用或作为备份。 ##### 6.10 创建...

    PL/SQL8.0 中文手册

    - 可以将结果导出为CSV、Excel等多种格式。 ##### 6.3 实例模式查询 - 支持直接查询数据库实例中的对象,无需指定具体的模式名称。 ##### 6.4 连接查询 - 支持复杂的连接查询操作,包括内连接、外连接等。 ##### ...

    plsql developer 7.0 最新中文手册 pdf格式

    - 支持多种格式,如CSV、Excel等。 **6.9 保存SQL脚本** - 可以将常用的SQL语句保存成脚本文件。 **6.10 创建标准查询** - 定义一组固定的查询条件作为模板。 - 便于日后快速调用。 #### 七、命令窗口 **7.1 ...

Global site tag (gtag.js) - Google Analytics