Skip to content

Commit 9194889

Browse files
author
svnlab
committed
fix aop bug
1 parent a8ddbd0 commit 9194889

File tree

8 files changed

+106
-68
lines changed

8 files changed

+106
-68
lines changed

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
-------
66

77
# EasyFile
8+
89
Make BigData Export Easier!!!
910

1011
## 欢迎Star!!!
12+
1113
**[主页](https://svnlab.github.io/)** \
1214
**[Github](https://github.com/openquartz/easy-file)**
1315

@@ -45,7 +47,8 @@ EasyFile-是为了提供更加便捷的文件服务,一整套Web大文件导出
4547

4648
Alibaba EasyExcel 是一个Excel文件生成导出、导入 解析工具。
4749

48-
EasyFile 是一个大文件导出的解决方案。用于解决大文件导出时遇到的,文件复用,文件导出超时,内存溢出,瞬时CPU 内存飙高等等问题的一整套解决方案。 同时EasyFile 不仅可以用于Excel
50+
EasyFile 是一个大文件导出的解决方案。用于解决大文件导出时遇到的,文件复用,文件导出超时,内存溢出,瞬时CPU 内存飙高等等问题的一整套解决方案。
51+
同时EasyFile 不仅可以用于Excel
4952
文件的导出,也可以用于csv,pdf,word 等文件导出的管理(暂时需要用户自己集成基础导出下载类BaseDownloadExecutor 实现文件生成逻辑)。
5053

5154
而且,EasyFile和Alibaba EasyExcel 并不冲突,依然可以结合EasyExcel 使用,文件生成逻辑使用Alibaba EasyExcel 做自行拓展使用。
@@ -74,14 +77,18 @@ EasyFile 提供两种模式
7477
- `easyfile-common`: 公共模块服务
7578
- `easyfile-core` : 核心服务
7679
- `easyfile-metrics` : metrics支持
77-
- `easyfile-metrics-api` : metrics-api 协议
78-
- `easyfile-metrics-promethes` : metrics-promethes 实现
80+
- `easyfile-metrics-api` : metrics-api 协议
81+
- `easyfile-metrics-promethes` : metrics-promethes 实现
7982
- `easyfile-storage`: 存储服务
8083
- `easyfile-storage-api`: 存储服务API
8184
- `easyfile-storage-remote`: 远程调用存储
8285
- `easyfile-storage-local`: 本地数据源存储
8386

84-
- `easyfile-spring-boot-starter`: easyfile starter 包
87+
- `easyfile-spring-boot-starter`: easyfile starter 包 工程module集合
88+
- `easyfile-spring-boot-starter-parent`: easyfile starter parent 工程
89+
- `easyfile-spring-boot-starter-local`: easyfile local 模式 starter工程包
90+
- `easyfile-spring-boot-starter-remote`: easyfile remote 模式 starter工程包
91+
8592
- `easyfile-server`: easyfile 远程存储服务端
8693

8794
- `easyfile-ui`: easyfile-admin ui-管理服务 (可选)

doc/AsyncFileHandler.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,9 @@
2828

2929
<dependency>
3030
<groupId>com.openquartz</groupId>
31-
<artifactId>easyfile-spring-boot-starter</artifactId>
31+
<artifactId>easyfile-spring-boot-starter-local</artifactId>
3232
<version>1.0.0</version>
3333
</dependency>
34-
<dependency>
35-
<groupId>com.openquartz</groupId>
36-
<artifactId>easyfile-storage-local</artifactId>
37-
<version>1.0.0</version>
38-
</dependency>
3934
```
4035

4136
使用DB触发处理器。需要依赖DB使用。 因此需要DB数据源执行建表-SQL

doc/QuickStart.md

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,20 @@
55
如果使用本地模式 引入maven
66

77
```xml
8-
9-
<dependency>
10-
<groupId>com.openquartz</groupId>
11-
<artifactId>easyfile-spring-boot-starter</artifactId>
12-
<version>1.0.0</version>
13-
</dependency>
148
<dependency>
159
<groupId>com.openquartz</groupId>
16-
<artifactId>easyfile-storage-local</artifactId>
17-
<version>1.0.0</version>
10+
<artifactId>easyfile-spring-boot-starter-local</artifactId>
11+
<version>1.4.0</version>
1812
</dependency>
1913
```
2014

2115
如果使用remote模式引入maven 依赖
2216

2317
```xml
24-
25-
<dependency>
26-
<groupId>com.openquartz</groupId>
27-
<artifactId>easyfile-spring-boot-starter</artifactId>
28-
<version>1.0.0</version>
29-
</dependency>
3018
<dependency>
3119
<groupId>com.openquartz</groupId>
32-
<artifactId>easyfile-storage-remote</artifactId>
33-
<version>1.0.0</version>
20+
<artifactId>easyfile-spring-boot-starter-remote</artifactId>
21+
<version>1.4.0</version>
3422
</dependency>
3523
```
3624

easyfile-core/src/main/java/com/openquartz/easyfile/core/executor/impl/DatabaseAsyncFileHandlerAdapter.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
package com.openquartz.easyfile.core.executor.impl;
22

3-
import com.openquartz.easyfile.core.executor.AsyncFileHandlerAdapter;
4-
import com.openquartz.easyfile.core.property.IDatabaseAsyncHandlerProperty;
5-
import com.openquartz.easyfile.core.property.IEasyFileDownloadProperty;
6-
import java.util.concurrent.ScheduledThreadPoolExecutor;
7-
import java.util.concurrent.TimeUnit;
8-
import lombok.extern.slf4j.Slf4j;
9-
import org.springframework.beans.factory.InitializingBean;
103
import com.openquartz.easyfile.common.bean.BaseDownloaderRequestContext;
114
import com.openquartz.easyfile.common.bean.DownloadRequestInfo;
5+
import com.openquartz.easyfile.common.concurrent.ThreadFactoryBuilder;
126
import com.openquartz.easyfile.common.request.DownloadTriggerRequest;
137
import com.openquartz.easyfile.common.response.DownloadTriggerEntry;
14-
import com.openquartz.easyfile.common.concurrent.ThreadFactoryBuilder;
15-
import com.openquartz.easyfile.common.util.SpringContextUtil;
8+
import com.openquartz.easyfile.core.executor.AsyncFileHandlerAdapter;
169
import com.openquartz.easyfile.core.executor.BaseDownloadExecutor;
1710
import com.openquartz.easyfile.core.executor.support.FileExportExecutorSupport;
11+
import com.openquartz.easyfile.core.executor.support.FileExportTriggerContext;
12+
import com.openquartz.easyfile.core.property.IDatabaseAsyncHandlerProperty;
13+
import com.openquartz.easyfile.core.property.IEasyFileDownloadProperty;
1814
import com.openquartz.easyfile.storage.download.DownloadStorageService;
1915
import com.openquartz.easyfile.storage.download.DownloadTriggerService;
2016
import com.openquartz.easyfile.storage.file.UploadService;
17+
import java.util.concurrent.ScheduledThreadPoolExecutor;
18+
import java.util.concurrent.TimeUnit;
19+
import lombok.extern.slf4j.Slf4j;
20+
import org.springframework.beans.factory.InitializingBean;
2121

2222
/**
2323
* 数据DB
@@ -77,13 +77,18 @@ public void doTrigger(DownloadTriggerEntry k) {
7777
DownloadRequestInfo requestInfo = storageService.getRequestInfoByRegisterId(k.getRegisterId());
7878
BaseDownloadExecutor executor = FileExportExecutorSupport
7979
.get(requestInfo.getDownloadCode());
80-
doExecute((BaseDownloadExecutor) SpringContextUtil.getTarget(executor),
81-
requestInfo.getRequestContext(), k.getRegisterId());
80+
81+
// set async trigger if absent
82+
FileExportTriggerContext.setAsyncTriggerFlagIfAbsent(true);
83+
doExecute(executor, requestInfo.getRequestContext(), k.getRegisterId());
8284
triggerService.exeSuccess(k.getRegisterId());
8385
} catch (Exception ex) {
8486
log.error("[DatabaseAsyncFileHandlerAdapter#doTrigger] execute-failed!registerId:{}", k.getRegisterId(),
8587
ex);
8688
triggerService.exeFail(k.getRegisterId());
89+
} finally {
90+
// clear context
91+
FileExportTriggerContext.clear();
8792
}
8893
}
8994
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.openquartz.easyfile.core.executor.support;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
import org.springframework.core.NamedThreadLocal;
7+
8+
/**
9+
* @author svnee
10+
*/
11+
public class FileExportTriggerContext {
12+
13+
private static final ThreadLocal<Map<String, Object>> currentFileExtend = new NamedThreadLocal<>(
14+
"Current File export");
15+
16+
private static final String ASYNC_TRIGGER_FLAG = "ASYNC_TRIGGER";
17+
18+
private FileExportTriggerContext() {
19+
}
20+
21+
public static void setAsyncTriggerFlagIfAbsent(boolean flag) {
22+
if (currentFileExtend.get() != null) {
23+
currentFileExtend.get().putIfAbsent(ASYNC_TRIGGER_FLAG, flag);
24+
} else {
25+
Map<String, Object> extMap = new HashMap<>();
26+
extMap.putIfAbsent(ASYNC_TRIGGER_FLAG, flag);
27+
currentFileExtend.set(extMap);
28+
}
29+
}
30+
31+
public static boolean isAsyncTrigger(){
32+
return (boolean) Optional.ofNullable(currentFileExtend.get())
33+
.map(e->e.get(ASYNC_TRIGGER_FLAG))
34+
.orElse(false);
35+
36+
}
37+
38+
public static void clear() {
39+
currentFileExtend.remove();
40+
}
41+
}

easyfile-core/src/main/java/com/openquartz/easyfile/core/metrics/DownloadMetricsListener.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.openquartz.easyfile.common.bean.BaseDownloaderRequestContext;
44
import com.openquartz.easyfile.common.response.ExportResult;
5+
import com.openquartz.easyfile.common.util.SpringContextUtil;
56
import com.openquartz.easyfile.core.annotations.FileExportExecutor;
67
import com.openquartz.easyfile.core.executor.BaseDownloadExecutor;
78
import com.openquartz.easyfile.core.intercept.DownloadExecutorInterceptor;
@@ -11,12 +12,14 @@
1112
import java.time.LocalDateTime;
1213
import java.time.temporal.ChronoUnit;
1314
import java.util.Objects;
15+
import lombok.extern.slf4j.Slf4j;
1416

1517
/**
1618
* DownloadMetricsListener
1719
*
1820
* @author svnee
1921
*/
22+
@Slf4j
2023
public class DownloadMetricsListener implements DownloadExecutorInterceptor {
2124

2225
static {
@@ -33,24 +36,37 @@ public class DownloadMetricsListener implements DownloadExecutorInterceptor {
3336
public void beforeExecute(BaseDownloadExecutor executor, BaseDownloaderRequestContext context, Long registerId,
3437
InterceptorContext interceptorContext) {
3538

36-
interceptorContext.set(START_TIME_KEY, LocalDateTime.now());
39+
try {
40+
interceptorContext.set(START_TIME_KEY, LocalDateTime.now());
3741

38-
FileExportExecutor exportExecutor = executor.getClass().getDeclaredAnnotation(FileExportExecutor.class);
39-
MetricsReporter.counterIncrement(MetricsKeyConstants.DOWNLOAD_COUNTER, new String[]{exportExecutor.value()});
42+
FileExportExecutor exportExecutor = SpringContextUtil
43+
.getRealClass(executor)
44+
.getDeclaredAnnotation(FileExportExecutor.class);
45+
MetricsReporter
46+
.counterIncrement(MetricsKeyConstants.DOWNLOAD_COUNTER, new String[]{exportExecutor.value()});
4047

41-
MetricsReporter.counterIncrement(MetricsKeyConstants.ASYNC_INVOKE_DOWNLOAD_TIMER,
42-
new String[]{exportExecutor.value()});
48+
MetricsReporter.counterIncrement(MetricsKeyConstants.ASYNC_INVOKE_DOWNLOAD_TIMER,
49+
new String[]{exportExecutor.value()});
50+
} catch (Exception ex) {
51+
log.error("[DownloadMetricsListener#beforeExecute] record metrics error!", ex);
52+
}
4353
}
4454

4555
@Override
4656
public void afterExecute(BaseDownloadExecutor executor, BaseDownloaderRequestContext context, ExportResult result,
4757
InterceptorContext interceptorContext) {
4858

49-
FileExportExecutor exportExecutor = executor.getClass().getDeclaredAnnotation(FileExportExecutor.class);
59+
try {
60+
FileExportExecutor exportExecutor = SpringContextUtil
61+
.getRealClass(executor)
62+
.getDeclaredAnnotation(FileExportExecutor.class);
5063

51-
MetricsReporter.recordTime(MetricsKeyConstants.ASYNC_INVOKE_DOWNLOAD_TIMER,
52-
new String[]{exportExecutor.value()},
53-
Objects.requireNonNull(interceptorContext.get(START_TIME_KEY, LocalDateTime.class))
54-
.until(LocalDateTime.now(), ChronoUnit.MILLIS));
64+
MetricsReporter.recordTime(MetricsKeyConstants.ASYNC_INVOKE_DOWNLOAD_TIMER,
65+
new String[]{exportExecutor.value()},
66+
Objects.requireNonNull(interceptorContext.get(START_TIME_KEY, LocalDateTime.class))
67+
.until(LocalDateTime.now(), ChronoUnit.MILLIS));
68+
} catch (Exception ex) {
69+
log.error("[DownloadMetricsListener#afterExecute] record metrics error!", ex);
70+
}
5571
}
5672
}

easyfile-example/pom.xml

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,7 @@
2323
<dependency>
2424
<groupId>com.openquartz</groupId>
2525
<artifactId>easyfile-spring-boot-starter</artifactId>
26-
<version>${revision}</version>
2726
</dependency>
2827
</dependencies>
2928

30-
<build>
31-
<plugins>
32-
<plugin>
33-
<groupId>org.apache.maven.plugins</groupId>
34-
<artifactId>maven-deploy-plugin</artifactId>
35-
<version>${maven.deploy.version}</version>
36-
<configuration>
37-
<skip>true</skip>
38-
</configuration>
39-
</plugin>
40-
<plugin>
41-
<groupId>org.apache.maven.plugins</groupId>
42-
<artifactId>maven-gpg-plugin</artifactId>
43-
<configuration>
44-
<skip>true</skip>
45-
</configuration>
46-
</plugin>
47-
</plugins>
48-
</build>
4929
</project>

easyfile-spring-boot-starter/easyfile-spring-boot-starter-parent/src/main/java/com/openquartz/easyfile/starter/aop/FileExportInterceptor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static com.openquartz.easyfile.core.exception.DownloadErrorCode.SYNC_DOWNLOAD_EXECUTE_ERROR;
55

66
import com.openquartz.easyfile.common.util.StringUtils;
7+
import com.openquartz.easyfile.core.executor.support.FileExportTriggerContext;
78
import com.openquartz.easyfile.starter.spring.boot.autoconfig.properties.EasyFileDownloadProperties;
89
import java.util.Map;
910
import java.util.Objects;
@@ -66,7 +67,12 @@ public FileExportInterceptor(EasyFileDownloadProperties downloadProperties,
6667
private static final String EXPORT_RESULT_METHOD_NAME = "exportResult";
6768

6869
@Override
69-
public Object invoke(MethodInvocation invocation) {
70+
public Object invoke(MethodInvocation invocation) throws Throwable {
71+
72+
// direct trigger if async trigger
73+
if (FileExportTriggerContext.isAsyncTrigger()){
74+
return invocation.proceed();
75+
}
7076

7177
Object[] args = invocation.getArguments();
7278
BaseDownloadExecutor executor = (BaseDownloadExecutor) invocation.getThis();

0 commit comments

Comments
 (0)