Skip to content

Commit 83dae01

Browse files
committed
1 parent a6dbef6 commit 83dae01

File tree

4 files changed

+103
-75
lines changed

4 files changed

+103
-75
lines changed

example/example-application/src/main/java/com/codingapi/example/handler/CHandler.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,19 @@
22

33
import com.codingapi.example.event.AEvent;
44
import com.codingapi.example.event.CEvent;
5-
import com.codingapi.springboot.framework.event.*;
5+
import com.codingapi.springboot.framework.event.EventPusher;
6+
import com.codingapi.springboot.framework.event.EventTraceContext;
7+
import com.codingapi.springboot.framework.event.IHandler;
68
import lombok.extern.slf4j.Slf4j;
79
import org.springframework.stereotype.Service;
810

9-
import java.util.List;
10-
1111
@Slf4j
1212
@Service
1313
public class CHandler implements IHandler<CEvent> {
1414

1515
@Override
1616
public void handler(CEvent event) {
17-
String eventKey = EventTraceContext.getInstance().getEventKey();
18-
log.info("c event:{},eventKey:{}",event, EventTraceContext.getInstance().getEventKey());
19-
List<IEvent> eventList = EventLogContext.getInstance().getEvents(eventKey);
20-
log.info("events:{}",eventList);
17+
log.info("c event:{},eventKey:{}", event, EventTraceContext.getInstance().getEventKey());
2118

2219
EventPusher.push(new AEvent());
2320
}

springboot-starter/src/main/java/com/codingapi/springboot/framework/event/EventLogContext.java

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.codingapi.springboot.framework.event;
2+
3+
import lombok.Getter;
4+
5+
import java.util.ArrayList;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
/**
11+
* 事件栈上下文
12+
*/
13+
public class EventStackContext {
14+
15+
private final Map<String, List<Class<?>>> eventClassStack = new HashMap<>();
16+
private final Map<String, List<IEvent>> eventStack = new HashMap<>();
17+
18+
@Getter
19+
private final static EventStackContext instance = new EventStackContext();
20+
21+
private EventStackContext() {
22+
23+
}
24+
25+
private void addEventClass(String traceId, IEvent event) {
26+
List<Class<?>> events = eventClassStack.get(traceId);
27+
if (events == null) {
28+
events = new ArrayList<>();
29+
}
30+
events.add(event.getClass());
31+
eventClassStack.put(traceId, events);
32+
}
33+
34+
private void addEventStack(String traceId, IEvent event) {
35+
List<IEvent> events = eventStack.get(traceId);
36+
if (events == null) {
37+
events = new ArrayList<>();
38+
}
39+
events.add(event);
40+
eventStack.put(traceId, events);
41+
}
42+
43+
44+
void addEvent(String traceId, IEvent event) {
45+
addEventClass(traceId, event);
46+
addEventStack(traceId, event);
47+
}
48+
49+
boolean checkEventLoop(String traceId, IEvent event) {
50+
List<Class<?>> events = eventClassStack.get(traceId);
51+
if (events != null) {
52+
return events.contains(event.getClass());
53+
}
54+
return false;
55+
}
56+
57+
public List<IEvent> getEvents(String eventKey) {
58+
if(eventKey!=null) {
59+
String traceId = eventKey.split("#")[0];
60+
return eventStack.get(traceId);
61+
}
62+
return null;
63+
}
64+
65+
public List<Class<?>> getEventClasses(String eventKey) {
66+
if(eventKey!=null) {
67+
String traceId = eventKey.split("#")[0];
68+
return eventClassStack.get(traceId);
69+
}
70+
return null;
71+
}
72+
73+
74+
void remove(String traceId) {
75+
eventStack.remove(traceId);
76+
eventClassStack.remove(traceId);
77+
}
78+
79+
80+
}

springboot-starter/src/main/java/com/codingapi/springboot/framework/event/EventTraceContext.java

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
import java.util.*;
88

9+
/**
10+
* 事件跟踪上下文
11+
*/
912
public class EventTraceContext {
1013

1114
@Getter
@@ -17,11 +20,9 @@ public class EventTraceContext {
1720
// thread local
1821
private final ThreadLocal<String> threadLocal = new ThreadLocal<>();
1922

20-
// event listener state
23+
// event listenerKey state
2124
private final Map<String, Boolean> eventKeyState = new HashMap<>();
2225

23-
// event stack
24-
private final Map<String, List<Class<?>>> eventStack = new HashMap<>();
2526

2627
private EventTraceContext() {
2728
}
@@ -36,7 +37,11 @@ String getOrCreateTrace() {
3637
return traceId;
3738
}
3839

39-
public String getEventKey(){
40+
/**
41+
* get event key
42+
* traceId = eventKey.split("#")[0]
43+
*/
44+
public String getEventKey() {
4045
return threadLocal.get();
4146
}
4247

@@ -54,31 +59,23 @@ void checkEventState() {
5459
// event execute finish
5560
String traceId = eventKey.split("#")[0];
5661
traceKeys.remove(traceId);
57-
eventStack.remove(traceId);
58-
EventLogContext.getInstance().removeEvents(traceId);
62+
EventStackContext.getInstance().remove(traceId);
5963
}
6064
}
6165
eventKeyState.remove(eventKey);
6266
threadLocal.remove();
6367
}
6468

6569
void addEvent(String traceId, IEvent event) {
66-
List<Class<?>> stack = eventStack.get(traceId);
67-
if (stack == null) {
68-
stack = new ArrayList<>();
69-
} else {
70-
if (stack.contains(event.getClass())) {
71-
//清空trace记录
72-
traceKeys.remove(traceId);
73-
eventStack.remove(traceId);
74-
eventKeyState.remove(traceId);
75-
threadLocal.remove();
76-
EventLogContext.getInstance().removeEvents(traceId);
77-
throw new EventLoopException(stack, event);
78-
}
70+
boolean hasEventLoop = EventStackContext.getInstance().checkEventLoop(traceId, event);
71+
if (hasEventLoop) {
72+
List<Class<?>> stack = EventStackContext.getInstance().getEventClasses(traceId);
73+
traceKeys.remove(traceId);
74+
EventStackContext.getInstance().remove(traceId);
75+
eventKeyState.remove(traceId);
76+
threadLocal.remove();
77+
throw new EventLoopException(stack, event);
7978
}
80-
EventLogContext.getInstance().addEvent(traceId,event);
81-
stack.add(event.getClass());
82-
eventStack.put(traceId, stack);
79+
EventStackContext.getInstance().addEvent(traceId, event);
8380
}
8481
}

0 commit comments

Comments
 (0)