16
16
17
17
package com .navercorp .pinpoint .rpc .client ;
18
18
19
- import com .navercorp .pinpoint .rpc .ChannelWriteFailListenableFuture ;
20
- import com .navercorp .pinpoint .rpc .DefaultFuture ;
21
- import com .navercorp .pinpoint .rpc .FailureEventHandler ;
22
19
import com .navercorp .pinpoint .rpc .PinpointSocketException ;
23
20
import com .navercorp .pinpoint .rpc .ResponseMessage ;
24
21
import com .navercorp .pinpoint .rpc .packet .RequestPacket ;
29
26
import org .jboss .netty .channel .Channel ;
30
27
import org .jboss .netty .util .Timeout ;
31
28
import org .jboss .netty .util .Timer ;
29
+ import org .jboss .netty .util .TimerTask ;
32
30
33
31
import java .util .Map ;
34
32
import java .util .Objects ;
33
+ import java .util .concurrent .CompletableFuture ;
35
34
import java .util .concurrent .ConcurrentHashMap ;
36
35
import java .util .concurrent .ConcurrentMap ;
37
36
import java .util .concurrent .TimeUnit ;
37
+ import java .util .concurrent .TimeoutException ;
38
38
import java .util .concurrent .atomic .AtomicInteger ;
39
+ import java .util .function .BiConsumer ;
39
40
40
41
/**
41
42
* @author emeroad
@@ -46,7 +47,7 @@ public class RequestManager {
46
47
47
48
private final AtomicInteger requestId = new AtomicInteger (1 );
48
49
49
- private final ConcurrentMap <Integer , DefaultFuture <ResponseMessage >> requestMap = new ConcurrentHashMap <>();
50
+ private final ConcurrentMap <Integer , CompletableFuture <ResponseMessage >> requestMap = new ConcurrentHashMap <>();
50
51
// Have to move Timer into factory?
51
52
private final Timer timer ;
52
53
private final long defaultTimeoutMillis ;
@@ -60,30 +61,37 @@ public RequestManager(Timer timer, long defaultTimeoutMillis) {
60
61
this .defaultTimeoutMillis = defaultTimeoutMillis ;
61
62
}
62
63
63
- private FailureEventHandler createFailureEventHandler (final int requestId ) {
64
- FailureEventHandler failureEventHandler = new FailureEventHandler () {
64
+ private BiConsumer < ResponseMessage , Throwable > createFailureEventHandler (final int requestId ) {
65
+ return new BiConsumer < ResponseMessage , Throwable > () {
65
66
@ Override
66
- public boolean fireFailure () {
67
- DefaultFuture <ResponseMessage > future = removeMessageFuture (requestId );
68
- if (future != null ) {
69
- // removed perfectly.
70
- return true ;
67
+ public void accept (ResponseMessage responseMessage , Throwable throwable ) {
68
+ if (throwable != null ) {
69
+ removeMessageFuture (requestId );
71
70
}
72
- return false ;
73
71
}
74
72
};
75
- return failureEventHandler ;
76
73
}
77
74
78
- private void addTimeoutTask (DefaultFuture future , long timeoutMillis ) {
75
+ private < T > void addTimeoutTask (CompletableFuture < T > future , long timeoutMillis ) {
79
76
Objects .requireNonNull (future , "future" );
80
77
81
78
try {
82
- Timeout timeout = timer .newTimeout (future , timeoutMillis , TimeUnit .MILLISECONDS );
83
- future .setTimeout (timeout );
79
+ Timeout timeout = timer .newTimeout (new TimerTask () {
80
+ @ Override
81
+ public void run (Timeout timeout ) throws Exception {
82
+ if (timeout .isCancelled ()) {
83
+ return ;
84
+ }
85
+ if (future .isDone ()) {
86
+ return ;
87
+ }
88
+ future .completeExceptionally (new TimeoutException ("Timeout by RequestManager-TIMER" ));
89
+ }
90
+ }, timeoutMillis , TimeUnit .MILLISECONDS );
91
+ future .thenAccept (t -> timeout .cancel ());
84
92
} catch (IllegalStateException e ) {
85
93
// this case is that timer has been shutdown. That maybe just means that socket has been closed.
86
- future .setFailure (new PinpointSocketException ("socket closed" )) ;
94
+ future .completeExceptionally (new PinpointSocketException ("socket closed" )) ;
87
95
}
88
96
}
89
97
@@ -93,7 +101,7 @@ public int nextRequestId() {
93
101
94
102
public void messageReceived (ResponsePacket responsePacket , String objectUniqName ) {
95
103
final int requestId = responsePacket .getRequestId ();
96
- final DefaultFuture <ResponseMessage > future = removeMessageFuture (requestId );
104
+ final CompletableFuture <ResponseMessage > future = removeMessageFuture (requestId );
97
105
if (future == null ) {
98
106
logger .warn ("future not found:{}, objectUniqName:{}" , responsePacket , objectUniqName );
99
107
return ;
@@ -102,12 +110,12 @@ public void messageReceived(ResponsePacket responsePacket, String objectUniqName
102
110
}
103
111
104
112
ResponseMessage response = ResponseMessage .wrap (responsePacket .getPayload ());
105
- future .setResult (response );
113
+ future .complete (response );
106
114
}
107
115
108
116
public void messageReceived (ResponsePacket responsePacket , PinpointServer pinpointServer ) {
109
117
final int requestId = responsePacket .getRequestId ();
110
- final DefaultFuture <ResponseMessage > future = removeMessageFuture (requestId );
118
+ final CompletableFuture <ResponseMessage > future = removeMessageFuture (requestId );
111
119
if (future == null ) {
112
120
logger .warn ("future not found:{}, pinpointServer:{}" , responsePacket , pinpointServer );
113
121
return ;
@@ -116,33 +124,32 @@ public void messageReceived(ResponsePacket responsePacket, PinpointServer pinpoi
116
124
}
117
125
118
126
ResponseMessage response = ResponseMessage .wrap (responsePacket .getPayload ());
119
- future .setResult (response );
127
+ future .complete (response );
120
128
}
121
129
122
- public DefaultFuture <ResponseMessage > removeMessageFuture (int requestId ) {
130
+ public CompletableFuture <ResponseMessage > removeMessageFuture (int requestId ) {
123
131
return this .requestMap .remove (requestId );
124
132
}
125
133
126
134
public void messageReceived (RequestPacket requestPacket , Channel channel ) {
127
135
logger .error ("unexpectedMessage received:{} address:{}" , requestPacket , channel .getRemoteAddress ());
128
136
}
129
137
130
- public ChannelWriteFailListenableFuture <ResponseMessage > register (int requestId ) {
138
+ public CompletableFuture <ResponseMessage > register (int requestId ) {
131
139
return register (requestId , defaultTimeoutMillis );
132
140
}
133
141
134
- public ChannelWriteFailListenableFuture <ResponseMessage > register (int requestId , long timeoutMillis ) {
142
+ public CompletableFuture <ResponseMessage > register (int requestId , long timeoutMillis ) {
135
143
// shutdown check
136
- final ChannelWriteFailListenableFuture <ResponseMessage > responseFuture = new ChannelWriteFailListenableFuture <>(timeoutMillis );
144
+ final CompletableFuture <ResponseMessage > responseFuture = new CompletableFuture <>();
137
145
138
- final DefaultFuture <ResponseMessage > old = this .requestMap .put (requestId , responseFuture );
146
+ final CompletableFuture <ResponseMessage > old = this .requestMap .put (requestId , responseFuture );
139
147
if (old != null ) {
140
148
throw new PinpointSocketException ("unexpected error. old future exist:" + old + " id:" + requestId );
141
149
}
142
-
143
150
// when future fails, put a handle in order to remove a failed future in the requestMap.
144
- FailureEventHandler removeTable = createFailureEventHandler (requestId );
145
- responseFuture .setFailureEventHandler (removeTable );
151
+ BiConsumer < ResponseMessage , Throwable > removeTable = createFailureEventHandler (requestId );
152
+ responseFuture .whenComplete (removeTable );
146
153
147
154
addTimeoutTask (responseFuture , timeoutMillis );
148
155
return responseFuture ;
@@ -190,8 +197,8 @@ public void close() {
190
197
// }
191
198
// }
192
199
int requestFailCount = 0 ;
193
- for (Map .Entry <Integer , DefaultFuture <ResponseMessage >> entry : requestMap .entrySet ()) {
194
- if (entry .getValue ().setFailure (closed )) {
200
+ for (Map .Entry <Integer , CompletableFuture <ResponseMessage >> entry : requestMap .entrySet ()) {
201
+ if (entry .getValue ().completeExceptionally (closed )) {
195
202
requestFailCount ++;
196
203
}
197
204
}
0 commit comments