src/main/java/com/alipay/remoting/DefaultConnectionManager.java
private ConnectionPool getConnectionPoolAndCreateIfAbsent(String poolKey,
                                                              Callable<ConnectionPool> callable)
                                                                                                throws RemotingException,
                                                                                                InterruptedException {
        RunStateRecordedFutureTask<ConnectionPool> initialTask = null;
        ConnectionPool pool = null;

        int retry = DEFAULT_RETRY_TIMES;

        int timesOfResultNull = 0;
        int timesOfInterrupt = 0;

        for (int i = 0; (i < retry) && (pool == null); ++i) {
            initialTask = this.connTasks.get(poolKey);
            if (null == initialTask) {
                initialTask = new RunStateRecordedFutureTask<ConnectionPool>(callable);
                initialTask = this.connTasks.putIfAbsent(poolKey, initialTask);
                if (null == initialTask) {
                    initialTask = this.connTasks.get(poolKey);
                    initialTask.run();
                }
            }

            try {
                pool = initialTask.get();
                if (null == pool) {
                    if (i + 1 < retry) {
                        timesOfResultNull++;
                        continue;
                    }
                    this.connTasks.remove(poolKey);
                    String errMsg = "Get future task result null for poolKey [" + poolKey
                                    + "] after [" + (timesOfResultNull + 1) + "] times try.";
                    throw new RemotingException(errMsg);
                }
            } catch (InterruptedException e) {
                if (i + 1 < retry) {
                    timesOfInterrupt++;
                    continue;// retry if interrupted
                }
                this.connTasks.remove(poolKey);
                logger
                    .warn(
                        "Future task of poolKey {} interrupted {} times. InterruptedException thrown and stop retry.",
                        poolKey, (timesOfInterrupt + 1), e);
                throw e;
            } catch (ExecutionException e) {
                // DO NOT retry if ExecutionException occurred
                this.connTasks.remove(poolKey);

                Throwable cause = e.getCause();
                if (cause instanceof RemotingException) {
                    throw (RemotingException) cause;
                } else {
                    FutureTaskUtil.launderThrowable(cause);
                }
            }
        }
        return pool;
    }
private ConnectionPool getConnectionPoolAndCreateIfAbsent(String poolKey,
                                                              Callable<ConnectionPool> callable)
                                                                                                throws RemotingException,
                                                                                                InterruptedException {
        RunStateRecordedFutureTask<ConnectionPool> initialTask = null;
        ConnectionPool pool = null;

        int retry = DEFAULT_RETRY_TIMES;

        int timesOfResultNull = 0;
        int timesOfInterrupt = 0;

        for (int i = 0; (i < retry) && (pool == null); ++i) {
            initialTask = this.connTasks.get(poolKey);
            if (null == initialTask) {
                initialTask = new RunStateRecordedFutureTask<ConnectionPool>(callable);
                initialTask = this.connTasks.putIfAbsent(poolKey, initialTask);
                if (null == initialTask) {
                    initialTask = this.connTasks.get(poolKey);
                    initialTask.run();
                }
            }

            try {
                pool = initialTask.get();
                if (null == pool) {
                    if (i + 1 < retry) {
                        timesOfResultNull++;
                        continue;
                    }
                    this.connTasks.remove(poolKey);
                    String errMsg = "Get future task result null for poolKey [" + poolKey
                                    + "] after [" + (timesOfResultNull + 1) + "] times try.";
                    throw new RemotingException(errMsg);
                }
            } catch (InterruptedException e) {
                if (i + 1 < retry) {
                    timesOfInterrupt++;
                    continue;// retry if interrupted
                }
                this.connTasks.remove(poolKey);
                logger
                    .warn(
                        "Future task of poolKey {} interrupted {} times. InterruptedException thrown and stop retry.",
                        poolKey, (timesOfInterrupt + 1), e);
                throw e;
            } catch (ExecutionException e) {
                // DO NOT retry if ExecutionException occurred
                this.connTasks.remove(poolKey);

                Throwable cause = e.getCause();
                if (cause instanceof RemotingException) {
                    throw (RemotingException) cause;
                } else {
                    FutureTaskUtil.launderThrowable(cause);
                }
            }
        }
        return pool;
    }
private ConnectionPool getConnectionPoolAndCreateIfAbsent ( String poolKey , Callable < ConnectionPool > callable ) throws RemotingException , InterruptedException { RunStateRecordedFutureTask < ConnectionPool > initialTask = null ; ConnectionPool pool = null ; int retry = DEFAULT_RETRY_TIMES ; int timesOfResultNull = 0 ; int timesOfInterrupt = 0 ; for ( int i = 0 ; ( i < retry ) && ( pool == null ) ; ++ i ) { initialTask = this . connTasks . get ( poolKey ) ; if ( null == initialTask ) { initialTask = new RunStateRecordedFutureTask < ConnectionPool > ( callable ) ; initialTask = this . connTasks . putIfAbsent ( poolKey , initialTask ) ; if ( null == initialTask ) { initialTask = this . connTasks . get ( poolKey ) ; initialTask . run ( ) ; } } try { pool = initialTask . get ( ) ; if ( null == pool ) { if ( i + 1 < retry ) { timesOfResultNull ++ ; continue ; } this . connTasks . remove ( poolKey ) ; String errMsg = "Get future task result null for poolKey [" + poolKey + "] after [" + ( timesOfResultNull + 1 ) + "] times try." ; throw new RemotingException ( errMsg ) ; } } catch ( InterruptedException e ) { if ( i + 1 < retry ) { timesOfInterrupt ++ ; continue ; // retry if interrupted } this . connTasks . remove ( poolKey ) ; logger . warn ( "Future task of poolKey {} interrupted {} times. InterruptedException thrown and stop retry." , poolKey , ( timesOfInterrupt + 1 ) , e ) ; throw e ; } catch ( ExecutionException e ) { // DO NOT retry if ExecutionException occurred this . connTasks . remove ( poolKey ) ; Throwable cause = e . getCause ( ) ; if ( cause instanceof RemotingException ) { throw ( RemotingException ) cause ; } else { FutureTaskUtil . launderThrowable ( cause ) ; } } } return pool ; }
Get the mapping instance of {@link ConnectionPool} with the specified poolKey,
or create one if there is none mapping in connTasks.

@param poolKey  mapping key of {@link ConnectionPool}
@param callable the callable task
@return a non-nullable instance of {@link ConnectionPool}
@throws RemotingException if there is no way to get an available {@link ConnectionPool}
@throws InterruptedException
Get the mapping instance of { @link ConnectionPool } with the specified poolKey or create one if there is none mapping in connTasks .