35
35
import com .navercorp .pinpoint .thrift .io .HeaderTBaseSerializer ;
36
36
import com .navercorp .pinpoint .thrift .io .SerializerFactory ;
37
37
import com .navercorp .pinpoint .thrift .util .SerializationUtils ;
38
-
39
- import org .apache .thrift .TBase ;
40
- import org .apache .logging .log4j .Logger ;
41
38
import org .apache .logging .log4j .LogManager ;
39
+ import org .apache .logging .log4j .Logger ;
40
+ import org .apache .thrift .TBase ;
42
41
import org .springframework .beans .factory .annotation .Qualifier ;
42
+ import org .springframework .lang .NonNull ;
43
43
44
44
import java .util .Objects ;
45
+ import java .util .concurrent .Executors ;
46
+ import java .util .concurrent .ScheduledExecutorService ;
47
+ import java .util .concurrent .ThreadFactory ;
48
+ import java .util .concurrent .TimeUnit ;
45
49
46
50
/**
47
51
* @author koo.taejin
@@ -51,6 +55,7 @@ public class StreamRouteHandler extends AbstractRouteHandler<StreamEvent> {
51
55
public static final String ATTACHMENT_KEY = StreamRouteManager .class .getSimpleName ();
52
56
53
57
private final Logger logger = LogManager .getLogger (this .getClass ());
58
+ private final ScheduledExecutorService streamExpireExecutor = createExecutor ("Stream-Expire" );
54
59
55
60
private final RouteFilterChain <StreamEvent > streamCreateFilterChain ;
56
61
private final RouteFilterChain <ResponseEvent > responseFilterChain ;
@@ -71,6 +76,15 @@ public StreamRouteHandler(ClusterPointLocator<ClusterPoint<?>> targetClusterPoin
71
76
this .commandSerializerFactory = Objects .requireNonNull (commandSerializerFactory , "commandSerializerFactory" );
72
77
}
73
78
79
+ private static ScheduledExecutorService createExecutor (String name ) {
80
+ return Executors .newSingleThreadScheduledExecutor (new ThreadFactory () {
81
+ @ Override
82
+ public Thread newThread (@ NonNull Runnable r ) {
83
+ return new Thread (r , name );
84
+ }
85
+ });
86
+ }
87
+
74
88
@ Override
75
89
public void addRequestFilter (RouteFilter <StreamEvent > filter ) {
76
90
this .streamCreateFilterChain .addLast (filter );
@@ -89,8 +103,7 @@ public void addCloseFilter(RouteFilter<StreamRouteCloseEvent> filter) {
89
103
public TCommandTransferResponse onRoute (StreamEvent event ) {
90
104
streamCreateFilterChain .doEvent (event );
91
105
92
- TCommandTransferResponse routeResult = onRoute0 (event );
93
- return routeResult ;
106
+ return onRoute0 (event );
94
107
}
95
108
96
109
private TCommandTransferResponse onRoute0 (StreamEvent event ) {
@@ -118,6 +131,7 @@ private TCommandTransferResponse onRoute0(StreamEvent event) {
118
131
119
132
ClientStreamChannel producerStreamChannel = createStreamChannel ((ThriftAgentConnection ) clusterPoint , event .getDeliveryCommand ().getPayload (), routeManager );
120
133
routeManager .setProducer (producerStreamChannel );
134
+ scheduleExpire (producerStreamChannel , event .getMaxAgeMs ());
121
135
return createResponse (TRouteResult .OK );
122
136
} else if (clusterPoint instanceof GrpcAgentConnection ) {
123
137
StreamRouteManager routeManager = new StreamRouteManager (event );
@@ -127,6 +141,7 @@ private TCommandTransferResponse onRoute0(StreamEvent event) {
127
141
128
142
ClientStreamChannel producerStreamChannel = ((GrpcAgentConnection ) clusterPoint ).openStream (event .getRequestObject (), routeManager );
129
143
routeManager .setProducer (producerStreamChannel );
144
+ scheduleExpire (producerStreamChannel , event .getMaxAgeMs ());
130
145
return createResponse (TRouteResult .OK );
131
146
} else {
132
147
return createResponse (TRouteResult .NOT_SUPPORTED_SERVICE );
@@ -143,6 +158,13 @@ private TCommandTransferResponse onRoute0(StreamEvent event) {
143
158
return createResponse (TRouteResult .UNKNOWN );
144
159
}
145
160
161
+ private void scheduleExpire (ClientStreamChannel channel , long maxAgeMs ) {
162
+ if (maxAgeMs < Long .MAX_VALUE ) {
163
+ final Runnable expireTask = () -> channel .close ();
164
+ streamExpireExecutor .schedule (expireTask , maxAgeMs , TimeUnit .MILLISECONDS );
165
+ }
166
+ }
167
+
146
168
private ClientStreamChannel createStreamChannel (ThriftAgentConnection clusterPoint , byte [] payload , ClientStreamChannelEventHandler streamChannelEventHandler ) throws StreamException {
147
169
PinpointServer pinpointServer = clusterPoint .getPinpointServer ();
148
170
return pinpointServer .openStreamAndAwait (payload , streamChannelEventHandler , 3000 );
0 commit comments