File tree Expand file tree Collapse file tree 1 file changed +10
-5
lines changed Expand file tree Collapse file tree 1 file changed +10
-5
lines changed Original file line number Diff line number Diff line change 1
1
# java异步编程规范
2
2
3
- ## async使用规范
3
+ ## Async使用规范
4
4
5
5
在java中推荐的异步编程方式是使用Spring的Async注解,该方式的优点是简单易用,当方法标注了Async注解以后,将在异步线程中执行该方法,但有以下限制:
6
6
12
12
13
13
### 1. 日志记录
14
14
15
- 由于Sync方法并非通过Controller进入,绕开了我们的通用异常拦截层,即CommonExceptionHandler,所以对于异步方法发生的异常没有进行日志记录,
16
- 为解决此问题,我们编写了 @AsyncExceptionLogger 注解,在所有@Async 方法同时加上此注解,即可保证异常得到记录。
15
+ 由于Sync方法并非通过Controller进入,绕开了我们的通用异常拦截层,即CommonExceptionHandler,所以对于异步方法发生的异常没有进行日志记录。
16
+
17
+ 为解决此问题,我们编写了** AsyncExceptionLogger** 注解,在所有@Async 方法加上此注解,即可保证异常得到记录。
17
18
18
19
例如:
19
20
@@ -27,7 +28,9 @@ public void asyncMethod() {
27
28
28
29
### 2. 与JPA整合
29
30
30
- 由于Async方法在新的异步线程中执行,JPA的OpenSessionInView无效,导致执行上下文中并不存在对应的EnitityManager,这会产生一系列问题,典型场景就是导致lazyLoading无效。为解决此问题,我们编写了@OpenJpaSession 注解,在需要访问数据库的@Async 方法中加此注解,即可实现与OpenSessionInView类似的效果。
31
+ 由于Async方法在新的异步线程中执行,JPA的OpenSessionInView无效,导致执行上下文中并不存在对应的EnitityManager,这会产生一系列问题,典型场景就是导致lazyLoading无效。
32
+
33
+ 为解决此问题,我们编写了** OpenJpaSession** 注解,在需要访问数据库的@Async 方法中加此注解,即可实现与OpenSessionInView类似的效果。
31
34
32
35
示例代码:
33
36
@@ -42,7 +45,9 @@ public void asyncMethod() {
42
45
43
46
### 3. 使用事务
44
47
45
- 我们当前使用事务的方式是使用@Transactional 注解,但由于@Transational 只能用在对象被调用的的第一个公有方法上,使用起来多有不便(为了事务而创建一个类实在不能接受),而且在很多情况下,我们都需要更加灵活地进行事务范围的控制。为此,我们编写了一个辅助类** TransactionHelper** ,使用方式如下:
48
+ 我们当前使用事务的方式是使用@Transactional 注解,但由于@Transational 只能用在对象被调用的的第一个公有方法上,使用起来多有不便(为了事务而创建一个类实在不能接受),而且在很多情况下,我们都需要更加灵活地进行事务范围的控制。
49
+
50
+ 为此,我们编写了一个辅助类** TransactionHelper** ,使用方式如下:
46
51
47
52
``` java
48
53
// 事务辅助对象,需要注入
You can’t perform that action at this time.
0 commit comments