@Override public void originsChanged(OriginsSnapshot snapshot) { origins.set(newArrayList(activeOrigins.snapshot())); }
@Override public LoadBalancer create(Environment environment, Configuration strategyConfiguration, ActiveOrigins activeOrigins) { return new RoundRobinStrategy(activeOrigins, activeOrigins.snapshot()); } }
@Override public Optional<RemoteHost> choose(LoadBalancer.Preferences preferences) { List<RemoteHost> snapshot = stream(activeOrigins.snapshot().spliterator(), false) .collect(Collectors.toList()); shuffle(snapshot); return snapshot.stream() .min(comparingInt(host -> host.metric().ongoingConnections())); } }
@Override public Optional<RemoteHost> choose(LoadBalancer.Preferences preferences) { RemoteHost[] hosts = toArray(activeOrigins.snapshot(), RemoteHost.class); if (hosts.length == 0) { return Optional.empty(); } else if (hosts.length == 1) { return Optional.of(hosts[0]); } else { int i1 = rng.nextInt(hosts.length); int i2 = drawFromRemaining(hosts.length, i1); return Optional.of(betterOf(hosts[i1], hosts[i2])); } }
@Override public Optional<RemoteHost> choose(LoadBalancer.Preferences context) { return context.preferredOrigins() .map(hostPreference -> { List<RemoteHost> list = stream(activeOrigins.snapshot().spliterator(), false) .filter(originIsAllowed(hostPreference)) .collect(toList()); if (list.size() > 0) { return Optional.of(list.get(rng.nextInt(list.size()))); } else { return Optional.<RemoteHost>empty(); } } ) .orElse(delegate.choose(context)); }
@Override public Optional<RemoteHost> choose(LoadBalancer.Preferences context) { return context.preferredOrigins() .flatMap(preferredHost -> originById(activeOrigins.snapshot(), preferredHost)) .map(Optional::of) .orElse(delegate.choose(context)); }