Skip to content

Commit a6dbef6

Browse files
committed
add EventTraceContext
1 parent d494eba commit a6dbef6

File tree

6 files changed

+79
-27
lines changed

6 files changed

+79
-27
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class AHandler implements IHandler<AEvent> {
1414

1515
@Override
1616
public void handler(AEvent event) {
17-
log.info("a event:{},traceId:{}",event, EventTraceContext.getInstance().getListenerKey());
17+
log.info("a event:{},eventKey:{}",event, EventTraceContext.getInstance().getEventKey());
1818

1919
EventPusher.push(new BEvent());
2020
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class BHandler implements IHandler<BEvent> {
1414

1515
@Override
1616
public void handler(BEvent event) {
17-
log.info("b event:{},traceId:{}",event, EventTraceContext.getInstance().getListenerKey());
17+
log.info("b event:{},eventKey:{}",event, EventTraceContext.getInstance().getEventKey());
1818

1919
EventPusher.push(new CEvent());
2020
}

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

+7-4
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@
22

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

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-
log.info("c event:{},traceId:{}",event, EventTraceContext.getInstance().getListenerKey());
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);
1821

1922
EventPusher.push(new AEvent());
2023
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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 EventLogContext {
14+
15+
16+
private final Map<String, List<IEvent>> eventLogs = new HashMap<>();
17+
18+
@Getter
19+
private static final EventLogContext instance = new EventLogContext();
20+
21+
private EventLogContext() {
22+
}
23+
24+
void addEvent(String traceId, IEvent event) {
25+
List<IEvent> eventList = eventLogs.get(traceId);
26+
if (eventList == null) {
27+
eventList = new ArrayList<>();
28+
}
29+
eventList.add(event);
30+
eventLogs.put(traceId, eventList);
31+
}
32+
33+
34+
void removeEvents(String traceId) {
35+
eventLogs.remove(traceId);
36+
}
37+
38+
39+
public List<IEvent> getEvents(String listenerKey) {
40+
if (listenerKey != null) {
41+
String traceId = listenerKey.split("#")[0];
42+
return eventLogs.get(traceId);
43+
}
44+
return null;
45+
}
46+
}

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

+20-17
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class EventTraceContext {
1818
private final ThreadLocal<String> threadLocal = new ThreadLocal<>();
1919

2020
// event listener state
21-
private final Map<String, Boolean> eventListenerState = new HashMap<>();
21+
private final Map<String, Boolean> eventKeyState = new HashMap<>();
2222

2323
// event stack
2424
private final Map<String, List<Class<?>>> eventStack = new HashMap<>();
@@ -27,37 +27,38 @@ private EventTraceContext() {
2727
}
2828

2929
String getOrCreateTrace() {
30-
String listenerKey = threadLocal.get();
31-
if (listenerKey != null) {
32-
return listenerKey.split("#")[0];
30+
String eventKey = threadLocal.get();
31+
if (eventKey != null) {
32+
return eventKey.split("#")[0];
3333
}
34-
String traceId = UUID.randomUUID().toString();
34+
String traceId = UUID.randomUUID().toString().replaceAll("-", "");
3535
traceKeys.add(traceId);
3636
return traceId;
3737
}
3838

39-
public String getListenerKey(){
39+
public String getEventKey(){
4040
return threadLocal.get();
4141
}
4242

43-
void createEventListener(String traceId) {
44-
String listenerKey = traceId + "#" + RandomGenerator.randomString(8);
45-
eventListenerState.put(listenerKey, false);
46-
threadLocal.set(listenerKey);
43+
void createEventKey(String traceId) {
44+
String eventKey = traceId + "#" + RandomGenerator.randomString(8);
45+
eventKeyState.put(eventKey, false);
46+
threadLocal.set(eventKey);
4747
}
4848

49-
void checkListener() {
50-
String listenerKey = threadLocal.get();
51-
if (listenerKey != null) {
52-
boolean state = eventListenerState.get(listenerKey);
49+
void checkEventState() {
50+
String eventKey = threadLocal.get();
51+
if (eventKey != null) {
52+
boolean state = eventKeyState.get(eventKey);
5353
if (!state) {
5454
// event execute finish
55-
String traceId = listenerKey.split("#")[0];
55+
String traceId = eventKey.split("#")[0];
5656
traceKeys.remove(traceId);
5757
eventStack.remove(traceId);
58+
EventLogContext.getInstance().removeEvents(traceId);
5859
}
5960
}
60-
eventListenerState.remove(listenerKey);
61+
eventKeyState.remove(eventKey);
6162
threadLocal.remove();
6263
}
6364

@@ -70,11 +71,13 @@ void addEvent(String traceId, IEvent event) {
7071
//清空trace记录
7172
traceKeys.remove(traceId);
7273
eventStack.remove(traceId);
73-
eventListenerState.remove(traceId);
74+
eventKeyState.remove(traceId);
7475
threadLocal.remove();
76+
EventLogContext.getInstance().removeEvents(traceId);
7577
throw new EventLoopException(stack, event);
7678
}
7779
}
80+
EventLogContext.getInstance().addEvent(traceId,event);
7881
stack.add(event.getClass());
7982
eventStack.put(traceId, stack);
8083
}

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ public void onApplicationEvent(DomainEvent domainEvent) {
3030
String traceId = domainEvent.getTraceId();
3131

3232
if (domainEvent.isSync()) {
33-
EventTraceContext.getInstance().createEventListener(traceId);
33+
EventTraceContext.getInstance().createEventKey(traceId);
3434
ApplicationHandlerUtils.getInstance().handler(domainEvent.getEvent());
35-
EventTraceContext.getInstance().checkListener();
35+
EventTraceContext.getInstance().checkEventState();
3636
} else {
3737
executorService.execute(() -> {
38-
EventTraceContext.getInstance().createEventListener(traceId);
38+
EventTraceContext.getInstance().createEventKey(traceId);
3939
ApplicationHandlerUtils.getInstance().handler(domainEvent.getEvent());
40-
EventTraceContext.getInstance().checkListener();
40+
EventTraceContext.getInstance().checkEventState();
4141
});
4242
}
4343
}

0 commit comments

Comments
 (0)