20
20
import java .net .InetAddress ;
21
21
import java .net .InetSocketAddress ;
22
22
import java .util .List ;
23
+ import java .util .concurrent .RejectedExecutionException ;
24
+ import java .util .concurrent .atomic .AtomicBoolean ;
23
25
24
26
import org .asynchttpclient .AsyncHandler ;
25
27
import org .asynchttpclient .handler .AsyncHandlerExtensions ;
@@ -33,13 +35,16 @@ public class NettyChannelConnector {
33
35
private final InetSocketAddress localAddress ;
34
36
private final List <InetSocketAddress > remoteAddresses ;
35
37
private final TimeoutsHolder timeoutsHolder ;
38
+ private final AtomicBoolean closed ;
36
39
private volatile int i = 0 ;
37
40
38
- public NettyChannelConnector (InetAddress localAddress , List <InetSocketAddress > remoteAddresses , AsyncHandler <?> asyncHandler , TimeoutsHolder timeoutsHolder ) {
41
+ public NettyChannelConnector (InetAddress localAddress , List <InetSocketAddress > remoteAddresses , AsyncHandler <?> asyncHandler , TimeoutsHolder timeoutsHolder ,
42
+ AtomicBoolean closed ) {
39
43
this .localAddress = localAddress != null ? new InetSocketAddress (localAddress , 0 ) : null ;
40
44
this .remoteAddresses = remoteAddresses ;
41
45
this .asyncHandlerExtensions = toAsyncHandlerExtensions (asyncHandler );
42
46
this .timeoutsHolder = timeoutsHolder ;
47
+ this .closed = closed ;
43
48
}
44
49
45
50
private boolean pickNextRemoteAddress () {
@@ -53,12 +58,24 @@ public void connect(final Bootstrap bootstrap, final NettyConnectListener<?> con
53
58
if (asyncHandlerExtensions != null )
54
59
asyncHandlerExtensions .onTcpConnectAttempt (remoteAddress );
55
60
56
- final ChannelFuture future = localAddress != null ? bootstrap .connect (remoteAddress , localAddress ) : bootstrap .connect (remoteAddress );
61
+ try {
62
+ connect0 (bootstrap , connectListener , remoteAddress );
63
+ } catch (RejectedExecutionException e ) {
64
+ if (closed .get ()) {
65
+ connectListener .onFailure (null , e );
66
+ } else {
67
+ throw e ;
68
+ }
69
+ }
70
+ }
71
+
72
+ private void connect0 (Bootstrap bootstrap , final NettyConnectListener <?> connectListener , InetSocketAddress remoteAddress ) {
73
+ final ChannelFuture future = bootstrap .connect (remoteAddress , localAddress );
57
74
58
75
future .addListener (new SimpleChannelFutureListener () {
59
76
60
77
@ Override
61
- public void onSuccess (Channel channel ) throws Exception {
78
+ public void onSuccess (Channel channel ) {
62
79
if (asyncHandlerExtensions != null ) {
63
80
asyncHandlerExtensions .onTcpConnectSuccess (remoteAddress , future .channel ());
64
81
}
@@ -67,7 +84,7 @@ public void onSuccess(Channel channel) throws Exception {
67
84
}
68
85
69
86
@ Override
70
- public void onFailure (Channel channel , Throwable t ) throws Exception {
87
+ public void onFailure (Channel channel , Throwable t ) {
71
88
if (asyncHandlerExtensions != null )
72
89
asyncHandlerExtensions .onTcpConnectFailure (remoteAddress , t );
73
90
boolean retry = pickNextRemoteAddress ();
0 commit comments