Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ef8831f

Browse files
committed
v2 version devlop
1 parent b1f08c6 commit ef8831f

File tree

5 files changed

+84
-1
lines changed

5 files changed

+84
-1
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
package io.github.lvyahui8.spring.aggregate2;
22

3+
import lombok.Data;
4+
import lombok.Getter;
5+
36
import java.util.Map;
7+
import java.util.concurrent.Executor;
48

59
/**
610
* @author feego lvyahui8@gmail.com
711
* @date 2022年4月1日
812
*/
13+
@Data
914
public class Context {
1015
Map<String,Object> resultMap;
1116
Map<String,Object> paramMap;
17+
Executor executor;
18+
ExceptionHandler exceptionHandler = new DefaultExceptionHandler();
19+
long defaultTimeout;
1220
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.github.lvyahui8.spring.aggregate2;
2+
3+
/**
4+
* @author feego lvyahui8@gmail.com
5+
* @date 2022年4月2日
6+
*/
7+
public class DefaultExceptionHandler implements ExceptionHandler
8+
{
9+
@Override
10+
public Object handle(Exception e) {
11+
// nothing to do
12+
return null;
13+
}
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.github.lvyahui8.spring.aggregate2;
2+
3+
/**
4+
* @author feego lvyahui8@gmail.com
5+
* @date 2022年4月2日
6+
*/
7+
public interface ExceptionHandler
8+
{
9+
Object handle(Exception e) ;
10+
}
Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,55 @@
11
package io.github.lvyahui8.spring.aggregate2;
22

3+
import lombok.Data;
4+
35
import java.lang.reflect.Method;
6+
import java.util.LinkedList;
7+
import java.util.List;
48
import java.util.Map;
9+
import java.util.concurrent.CompletableFuture;
10+
import java.util.concurrent.CountDownLatch;
511

612
/**
713
* @author feego lvyahui8@gmail.com
814
* @date 2022年4月1日
915
*/
16+
@Data
1017
public class ResourceNode {
1118
Object target;
1219
Method method;
1320

14-
Map<String,ResourceNode> dependents;
21+
Map<String,Dependent> dependents;
22+
23+
@Data
24+
class Dependent {
25+
boolean strong;
26+
ResourceNode node;
27+
}
28+
29+
public Object invoke(Context context) throws Exception {
30+
List<Object> args = new LinkedList<>();
31+
if (dependents != null) {
32+
List<CompletableFuture<Object>> asyncList = new LinkedList<>();
33+
for (Map.Entry<String, Dependent> entry : dependents.entrySet()) {
34+
final Dependent dependent = entry.getValue();
35+
asyncList.add(CompletableFuture.supplyAsync(() -> {
36+
try {
37+
return dependent.node.invoke(context);
38+
} catch (Exception e) {
39+
if (dependent.isStrong()) {
40+
throw new StrongDependentException(e);
41+
} else {
42+
return context.getExceptionHandler().handle(e);
43+
}
44+
}
45+
}, context.getExecutor()));
46+
}
47+
final CompletableFuture<Void> allOf = CompletableFuture.allOf(asyncList.toArray(new CompletableFuture[0]));
48+
allOf.wait(context.getDefaultTimeout());
49+
for (CompletableFuture<Object> future : asyncList) {
50+
args.add(future.get());
51+
}
52+
}
53+
return method.invoke(target,args.toArray(new Object[0]));
54+
}
1555
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.github.lvyahui8.spring.aggregate2;
2+
3+
/**
4+
* @author feego lvyahui8@gmail.com
5+
* @date 2022年4月2日
6+
*/
7+
public class StrongDependentException extends RuntimeException {
8+
public StrongDependentException(Throwable cause) {
9+
super(cause);
10+
}
11+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /