down-center-domain

所属分类:大数据
开发工具:Java
文件大小:0KB
下载次数:0
上传日期:2024-03-21 02:33:08
上 传 者sh-1993
说明:  下载中心domain module,解决导出大数据量Excel时候的下载问题
(The domain module of the download center solves the download problem when exporting large amounts of Excel data)

文件列表:
src/
LICENSE
diagram.jpg
pom.xml

# 简介 * 解决导出大数据量Excel时候的下载问题 * 采用异步提交下载任务,并定时清除任务的方式实现 * 采用DDD将核心逻辑抽取了domain模块 # 使用 需要在下载中心服务中引入domain module,实现接口和注入bean 使用案例:[down-center-sample](https://github.com/xiguazhiPrince/down-center-sample) ```java @Configuration public class DownCenterBeanConfig { /** * 需要自己实现task的Repository接口 {@link com.watermelon.domain.task.repository.TaskRepository} *
* 可以自定义数据库,但是字段需要和 {@link com.watermelon.domain.task.entity.Task} 的一致 */ @Bean public TaskRepository taskRepository(){ return new TestTaskRepository(); } /** * 自己实现文件上传类 {@link com.watermelon.domain.task.external.UploadFileService} */ @Bean public S3UploadFileServiceImpl uploadFileService(){ return new S3UploadFileServiceImpl(); } /** * 注入{@link TaskDomainServiceImpl} */ @Bean public TaskDomainService taskDomainService(TaskRepository testTaskRepository){ return new TaskDomainServiceImpl(testTaskRepository); } /** * 注入组件:任务处理器 {@link TaskHandlerComponent} */ @Bean public DefaultTaskHandlerComponent taskHandler(TaskDomainService taskDomainService, S3UploadFileServiceImpl uploadFileService){ return new DefaultTaskHandlerComponent(taskDomainService, uploadFileService); } /** * 注入组件: watchDog {@link WatchDogComponent} */ @Bean public DefaultWatchDogComponent watchDog(TaskRepository taskRepository){ return new DefaultWatchDogComponent(taskRepository); } /** * 注入自己实现生成excel数据的Selector {@link com.watermelon.domain.task.external.DataSelectorUnit} */ @Bean public TestExcelHandlerUnit testExcelHandlerUnit(){ return new TestExcelHandlerUnit(); } /** * 可以自定义一些配置 */ @Bean @ConfigurationProperties(prefix = "down-center", ignoreUnknownFields = true) public DownSettingConfig downConfig(){ return new DownSettingConfig(); } /** * 启动两个组件 */ @PostConstruct public void init(){ DownSettingConfig downSettingConfig = downConfig(); TaskContext.setPageSize(downSettingConfig.getPageSize()); TaskContext.setBindTimeoutMinutes(downSettingConfig.getBindTimeoutMinutes()); startTask(); startWatchDog(); } /** * 开启异步处理任务 */ private void startTask() { DefaultTaskHandlerComponent defaultTaskHandler = taskHandler(taskDomainService(taskRepository()), uploadFileService()); Executors .newSingleThreadScheduledExecutor() .scheduleWithFixedDelay( defaultTaskHandler::createAndUploadHandler, 1, 1, TimeUnit.SECONDS ); } /** * 启动watchDog */ private void startWatchDog() { DefaultWatchDogComponent defaultWatchDog = watchDog(taskRepository()); Executors .newSingleThreadScheduledExecutor() .scheduleWithFixedDelay( ()->{ defaultWatchDog.delayCurrentInstanceTask(); defaultWatchDog.resetTimeoutTask(); }, 1, 1, TimeUnit.SECONDS ); } } ``` # 功能清单 总共有两个核心组件: 1. 任务处理器: 查询数据、生成文件、上传文件 2. watchDog: 清理失效任务,给长耗时任务续期 还有2个工具类: 1. 使用注解指定表头,生成excel文件 2. 数据分页查询的通用工具 # 架构设计 有2个核心组件:任务处理器、watchDog ## 任务处理器: TaskHandlerComponent 1. 用于异步处理task任务, 目前是串行处理任务 2. 把task任务绑定到instance,防止重复处理 ## watchDog: WatchDogComponent 1. 对于超时未完成处理的任务(假如instance挂了),重置task的绑定和处理状态 2. 给正在处理中的任务进行续期,防止处理时间过长导致task被重置
时序流程图: ![时序图](https://github.com/xiguazhiPrince/down-center-domain/blob/master/diagram.jpg "时序图") # 后续规划 ## 添加多线程处理能力 目前可以解决多个服务同时部署的任务抢占问题 但是如果创建了多个任务处理器,使用多线程去处理的话,会导致任务在同一实例间被抢占 后续计划引入多线程处理能力,充分利用资源加快任务吞吐能力 # 更新日志 * 添加了合并单元格功能

近期下载者

相关文件


收藏者