Skip to content

Commit b5ade4c

Browse files
committed
[pinpoint-apm#9666] Overriding webSocketHandler
1 parent f52be14 commit b5ade4c

File tree

4 files changed

+50
-30
lines changed

4 files changed

+50
-30
lines changed

web/src/main/java/com/navercorp/pinpoint/web/websocket/ActiveThreadCountHandler.java

+30-21
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package com.navercorp.pinpoint.web.websocket;
1818

19-
import com.navercorp.pinpoint.common.util.CpuUtils;
2019
import com.navercorp.pinpoint.common.profiler.concurrent.PinpointThreadFactory;
20+
import com.navercorp.pinpoint.common.util.CpuUtils;
2121
import com.navercorp.pinpoint.rpc.util.ClassUtils;
2222
import com.navercorp.pinpoint.rpc.util.MapUtils;
2323
import com.navercorp.pinpoint.web.security.ServerMapDataFilter;
@@ -28,12 +28,12 @@
2828
import com.navercorp.pinpoint.web.websocket.message.PinpointWebSocketMessage;
2929
import com.navercorp.pinpoint.web.websocket.message.PinpointWebSocketMessageConverter;
3030
import com.navercorp.pinpoint.web.websocket.message.PinpointWebSocketMessageType;
31-
import com.navercorp.pinpoint.web.websocket.message.PongMessage;
3231
import com.navercorp.pinpoint.web.websocket.message.RequestMessage;
3332
import org.apache.commons.lang3.StringUtils;
34-
import org.apache.logging.log4j.Logger;
3533
import org.apache.logging.log4j.LogManager;
34+
import org.apache.logging.log4j.Logger;
3635
import org.springframework.beans.factory.annotation.Autowired;
36+
import org.springframework.lang.NonNull;
3737
import org.springframework.web.socket.CloseStatus;
3838
import org.springframework.web.socket.TextMessage;
3939
import org.springframework.web.socket.WebSocketSession;
@@ -84,7 +84,7 @@ public class ActiveThreadCountHandler extends TextWebSocketHandler implements Pi
8484

8585
private Timer reactiveTimer;
8686

87-
@Autowired(required=false)
87+
@Autowired(required = false)
8888
ServerMapDataFilter serverMapDataFilter;
8989

9090
@Autowired(required = false)
@@ -154,6 +154,11 @@ public String getRequestMapping() {
154154
return requestMapping;
155155
}
156156

157+
@Override
158+
public int getPriority() {
159+
return 0;
160+
}
161+
157162
private WebSocketSessionContext getSessionContext(WebSocketSession webSocketSession) {
158163
final WebSocketSessionContext sessionContext = WebSocketSessionContext.getSessionContext(webSocketSession);
159164
if (sessionContext == null) {
@@ -163,7 +168,7 @@ private WebSocketSessionContext getSessionContext(WebSocketSession webSocketSess
163168
}
164169

165170
@Override
166-
public void afterConnectionEstablished(WebSocketSession newSession) throws Exception {
171+
public void afterConnectionEstablished(@NonNull WebSocketSession newSession) throws Exception {
167172
logger.info("ConnectionEstablished. session:{}", newSession);
168173

169174
synchronized (lock) {
@@ -179,7 +184,7 @@ public void afterConnectionEstablished(WebSocketSession newSession) throws Excep
179184
}
180185

181186
@Override
182-
public void afterConnectionClosed(WebSocketSession closeSession, CloseStatus status) throws Exception {
187+
public void afterConnectionClosed(@NonNull WebSocketSession closeSession, @NonNull CloseStatus status) throws Exception {
183188
logger.info("ConnectionClose. session:{}, caused:{}", closeSession, status);
184189

185190
final WebSocketSessionContext sessionContext = getSessionContext(closeSession);
@@ -196,7 +201,7 @@ public void afterConnectionClosed(WebSocketSession closeSession, CloseStatus sta
196201
}
197202

198203
@Override
199-
protected void handleTextMessage(WebSocketSession webSocketSession, TextMessage message) throws Exception {
204+
protected void handleTextMessage(@NonNull WebSocketSession webSocketSession, TextMessage message) throws Exception {
200205
logger.info("handleTextMessage. session:{}, remote:{}, message:{}.", webSocketSession, webSocketSession.getRemoteAddress(), message.getPayload());
201206

202207
PinpointWebSocketMessage webSocketMessage = messageConverter.getWebSocketMessage(message.getPayload());
@@ -206,7 +211,7 @@ protected void handleTextMessage(WebSocketSession webSocketSession, TextMessage
206211
handleRequestMessage0(webSocketSession, (RequestMessage) webSocketMessage);
207212
break;
208213
case PONG:
209-
handlePongMessage0(webSocketSession, (PongMessage) webSocketMessage);
214+
handlePongMessage0(webSocketSession);
210215
break;
211216
default:
212217
logger.warn("Unexpected WebSocketMessageType received. messageType:{}.", webSocketMessageType);
@@ -233,18 +238,22 @@ private void handleRequestMessage0(WebSocketSession webSocketSession, RequestMes
233238
private void handleActiveThreadCount(WebSocketSession webSocketSession, RequestMessage requestMessage) {
234239
final String applicationName = MapUtils.getString(requestMessage.getParameters(), APPLICATION_NAME_KEY);
235240
if (applicationName != null) {
236-
final WebSocketSessionContext sessionContext = getSessionContext(webSocketSession);
237-
synchronized (lock) {
238-
if (StringUtils.equals(applicationName, sessionContext.getApplicationName())) {
239-
return;
240-
}
241+
handleActiveThreadCount(webSocketSession, applicationName);
242+
}
243+
}
241244

242-
unbindingResponseAggregator(webSocketSession, sessionContext);
243-
if (webSocketSession.isOpen()) {
244-
bindingResponseAggregator(webSocketSession, sessionContext, applicationName);
245-
} else {
246-
logger.warn("WebSocketSession is not opened. skip binding.");
247-
}
245+
protected void handleActiveThreadCount(WebSocketSession webSocketSession, String applicationName) {
246+
final WebSocketSessionContext sessionContext = getSessionContext(webSocketSession);
247+
synchronized (lock) {
248+
if (StringUtils.equals(applicationName, sessionContext.getApplicationName())) {
249+
return;
250+
}
251+
252+
unbindingResponseAggregator(webSocketSession, sessionContext);
253+
if (webSocketSession.isOpen()) {
254+
bindingResponseAggregator(webSocketSession, sessionContext, applicationName);
255+
} else {
256+
logger.warn("WebSocketSession is not opened. skip binding.");
248257
}
249258
}
250259
}
@@ -257,13 +266,13 @@ private void closeSession(WebSocketSession session, CloseStatus status) {
257266
}
258267
}
259268

260-
private void handlePongMessage0(WebSocketSession webSocketSession, PongMessage pongMessage) {
269+
private void handlePongMessage0(WebSocketSession webSocketSession) {
261270
final WebSocketSessionContext sessionContext = getSessionContext(webSocketSession);
262271
sessionContext.changeHealthCheckSuccess();
263272
}
264273

265274
@Override
266-
protected void handlePongMessage(WebSocketSession webSocketSession, org.springframework.web.socket.PongMessage message) throws Exception {
275+
protected void handlePongMessage(@NonNull WebSocketSession webSocketSession, org.springframework.web.socket.PongMessage message) throws Exception {
267276
logger.info("handlePongMessage. session:{}, remote:{}, message:{}.", webSocketSession, webSocketSession.getRemoteAddress(), message.getPayload());
268277

269278
super.handlePongMessage(webSocketSession, message);

web/src/main/java/com/navercorp/pinpoint/web/websocket/PinpointWebSocketHandler.java

+2
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ public interface PinpointWebSocketHandler extends WebSocketHandler {
2929

3030
String getRequestMapping();
3131

32+
int getPriority();
33+
3234
}

web/src/main/java/com/navercorp/pinpoint/web/websocket/PinpointWebSocketHandlerManager.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import javax.annotation.PreDestroy;
2121
import java.util.ArrayList;
2222
import java.util.Collections;
23+
import java.util.HashMap;
2324
import java.util.List;
25+
import java.util.Map;
2426

2527
/**
2628
* @author Taejin Koo
@@ -30,7 +32,21 @@ public class PinpointWebSocketHandlerManager {
3032
private final List<PinpointWebSocketHandler> webSocketHandlerRepository;
3133

3234
public PinpointWebSocketHandlerManager(List<PinpointWebSocketHandler> pinpointWebSocketHandlers) {
33-
this.webSocketHandlerRepository = new ArrayList<>(pinpointWebSocketHandlers);
35+
this.webSocketHandlerRepository = normalize(pinpointWebSocketHandlers);
36+
}
37+
38+
private List<PinpointWebSocketHandler> normalize(List<PinpointWebSocketHandler> handlers) {
39+
Map<String, PinpointWebSocketHandler> handlerMap = new HashMap<>(handlers.size());
40+
for (final PinpointWebSocketHandler handler: handlers) {
41+
final String requestMapping = handler.getRequestMapping();
42+
final int priority = handler.getPriority();
43+
44+
final PinpointWebSocketHandler prev = handlerMap.get(requestMapping);
45+
if (prev == null || prev.getPriority() < priority) {
46+
handlerMap.put(requestMapping, handler);
47+
}
48+
}
49+
return new ArrayList<>(handlerMap.values());
3450
}
3551

3652
@PostConstruct

web/src/main/resources/applicationContext-web-websocket.xml

+1-8
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,6 @@
1414
</bean>
1515

1616

17-
<bean id="handlerRegister" class="com.navercorp.pinpoint.web.websocket.PinpointWebSocketHandlerManager">
18-
<constructor-arg>
19-
<list>
20-
<ref bean="activeThreadHandler" />
21-
</list>
22-
</constructor-arg>
23-
</bean>
24-
17+
<bean id="handlerRegister" class="com.navercorp.pinpoint.web.websocket.PinpointWebSocketHandlerManager" />
2518

2619
</beans>

0 commit comments

Comments
 (0)