当异步导出使用一段时间后,会出现大量的没有用的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&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添加完毕。
相关推荐
SQL SERVER是微软提供的一个强大关系型数据库管理系统,而Excel则是处理和分析表格数据的办公软件。 首先,我们需要理解Delphi如何与SQL SERVER交互。Delphi中通常会使用ADO(ActiveX Data Objects)组件来连接和...
将DataGrid的数据导出到Excel,可以方便地进行数据编辑、格式化和分析。这通常通过编程实现,例如使用C#或VB.NET,利用`Microsoft.Office.Interop.Excel`库来创建Excel工作簿,将DataGrid中的每一行数据写入对应的...
系统用户:对各个基本的组会员增删改查,单发、群发邮件短信,导入导出excel表格,批量删除 3. 会员管理:对前台用户管理,分配会员级别,到期时间,状态,联系信息等资料 4. 菜单管理:增删改查菜单 ztree(自定义...
系统用户:对各个基本的组会员增删改查,单发、群发邮件短信,导入导出excel表格,批量删除 3. 会员管理:对前台用户管理,分配会员级别,到期时间,状态,联系信息等资料 4. 菜单管理:增删改查菜单 ztree(自定义...
开发者需要编写代码读取数据库数据,然后利用POI API将数据填充到Excel表格中,生成可供下载的文件。 除此之外,系统的设计和实现还涉及前端界面的构建。可能采用了Bootstrap或Vue.js等前端框架,提供了友好的用户...
Bootstrap-Export(各种报表导出SQL,Excel,pdf等)框架,整合Echars,各类图表的展示(折线图,饼图,直方图等),使用了layui的弹出层、菜单、文件上传、富文本编辑、日历、选项卡、数据表格等 Oracle关系型...
用Redis做中间缓存,缓存数据 实现异步处理,定时任务,整合Quartz Job以及Spring Task 邮件管理功能, 整合spring-boot-starter-mail发送邮件等, 数据源:druid 用户管理,菜单管理,角色管理,代码生成 ...
3. 报表布局:Oracle Report支持多种布局设计,如表格、图表、文本块等。开发者可以通过拖放方式调整元素位置,设置单元格样式、边框、对齐方式等。 4. 样式和主题:Report提供了丰富的样式和主题选择,可以自定义...
8. **报表服务**:Microsoft的SQL Server Reporting Services (SSRS) 是一个全面的报表解决方案,它可以与ASP.NET集成,提供更高级的功能,如定时报表生成、订阅、安全管理和部署。 9. **性能优化**:对于大数据量...
- 将查询结果导出为 CSV、Excel 或其他格式。 8. **保存 SQL 脚本** - 将 SQL 语句保存为文件,方便日后重用。 #### 七、命令窗口 1. **输入 SQL 语句和命令** - 支持直接在命令窗口中执行 SQL 语句和其他命令。...
- 可以将 SQL 查询的结果直接导出为 CSV、Excel 等格式的文件。 - 便于与其他应用程序共享数据。 ##### 6.9 保存 SQL 脚本 - 支持将 SQL 语句保存为脚本文件。 - 方便后续重复使用或作为备份。 ##### 6.10 创建...
- 可以将结果导出为CSV、Excel等多种格式。 ##### 6.3 实例模式查询 - 支持直接查询数据库实例中的对象,无需指定具体的模式名称。 ##### 6.4 连接查询 - 支持复杂的连接查询操作,包括内连接、外连接等。 ##### ...
- 支持多种格式,如CSV、Excel等。 **6.9 保存SQL脚本** - 可以将常用的SQL语句保存成脚本文件。 **6.10 创建标准查询** - 定义一组固定的查询条件作为模板。 - 便于日后快速调用。 #### 七、命令窗口 **7.1 ...