Home / Class/ RoundRobinInetAddressResolver Class — netty Architecture

RoundRobinInetAddressResolver Class — netty Architecture

Architecture documentation for the RoundRobinInetAddressResolver class in RoundRobinInetAddressResolver.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  98d66d81_a0c9_6fef_a9dd_7d394e0ca501["RoundRobinInetAddressResolver"]
  0ae1d2c4_0752_0c02_a0e9_0d10571116e4["RoundRobinInetAddressResolver.java"]
  98d66d81_a0c9_6fef_a9dd_7d394e0ca501 -->|defined in| 0ae1d2c4_0752_0c02_a0e9_0d10571116e4
  b86eab6a_886d_5c9b_b472_91be1144847c["RoundRobinInetAddressResolver()"]
  98d66d81_a0c9_6fef_a9dd_7d394e0ca501 -->|method| b86eab6a_886d_5c9b_b472_91be1144847c
  42755012_9520_6e5c_15aa_ee27dfde01c8["doResolve()"]
  98d66d81_a0c9_6fef_a9dd_7d394e0ca501 -->|method| 42755012_9520_6e5c_15aa_ee27dfde01c8
  f5c06d93_17be_7a74_47aa_7c82f79e7d59["doResolveAll()"]
  98d66d81_a0c9_6fef_a9dd_7d394e0ca501 -->|method| f5c06d93_17be_7a74_47aa_7c82f79e7d59
  e78f5931_63af_709e_1cd7_e63090adbe84["randomIndex()"]
  98d66d81_a0c9_6fef_a9dd_7d394e0ca501 -->|method| e78f5931_63af_709e_1cd7_e63090adbe84
  6293c2a5_4d91_f58c_5562_66781764c1c9["close()"]
  98d66d81_a0c9_6fef_a9dd_7d394e0ca501 -->|method| 6293c2a5_4d91_f58c_5562_66781764c1c9

Relationship Graph

Source Code

resolver/src/main/java/io/netty/resolver/RoundRobinInetAddressResolver.java lines 37–100

public class RoundRobinInetAddressResolver extends InetNameResolver {
    private final NameResolver<InetAddress> nameResolver;

    /**
     * @param executor the {@link EventExecutor} which is used to notify the listeners of the {@link Future} returned by
     * {@link #resolve(String)}
     * @param nameResolver the {@link NameResolver} used for name resolution
     */
    public RoundRobinInetAddressResolver(EventExecutor executor, NameResolver<InetAddress> nameResolver) {
        super(executor);
        this.nameResolver = nameResolver;
    }

    @Override
    protected void doResolve(final String inetHost, final Promise<InetAddress> promise) throws Exception {
        // hijack the doResolve request, but do a doResolveAll request under the hood.
        // Note that InetSocketAddress.getHostName() will never incur a reverse lookup here,
        // because an unresolved address always has a host name.
        nameResolver.resolveAll(inetHost).addListener((FutureListener<List<InetAddress>>) future -> {
            if (future.isSuccess()) {
                List<InetAddress> inetAddresses = future.getNow();
                int numAddresses = inetAddresses.size();
                if (numAddresses > 0) {
                    // if there are multiple addresses: we shall pick one by one
                    // to support the round robin distribution
                    promise.setSuccess(inetAddresses.get(randomIndex(numAddresses)));
                } else {
                    promise.setFailure(new UnknownHostException(inetHost));
                }
            } else {
                promise.setFailure(future.cause());
            }
        });
    }

    @Override
    protected void doResolveAll(String inetHost, final Promise<List<InetAddress>> promise) throws Exception {
        nameResolver.resolveAll(inetHost).addListener((FutureListener<List<InetAddress>>) future -> {
            if (future.isSuccess()) {
                List<InetAddress> inetAddresses = future.getNow();
                if (!inetAddresses.isEmpty()) {
                    // create a copy to make sure that it's modifiable random access collection
                    List<InetAddress> result = new ArrayList<InetAddress>(inetAddresses);
                    // rotate by different distance each time to force round robin distribution
                    Collections.rotate(result, randomIndex(inetAddresses.size()));
                    promise.setSuccess(result);
                } else {
                    promise.setSuccess(inetAddresses);
                }
            } else {
                promise.setFailure(future.cause());
            }
        });
    }

    private static int randomIndex(int numAddresses) {
        return numAddresses == 1 ? 0 : ThreadLocalRandom.current().nextInt(numAddresses);
    }

    @Override
    public void close() {
        nameResolver.close();
    }
}

Frequently Asked Questions

What is the RoundRobinInetAddressResolver class?
RoundRobinInetAddressResolver is a class in the netty codebase, defined in resolver/src/main/java/io/netty/resolver/RoundRobinInetAddressResolver.java.
Where is RoundRobinInetAddressResolver defined?
RoundRobinInetAddressResolver is defined in resolver/src/main/java/io/netty/resolver/RoundRobinInetAddressResolver.java at line 37.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free