From c234663f871f48223532c9cae0e68d5eda2a0995 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 1 Dec 2023 08:40:30 +0800 Subject: [PATCH] =?UTF-8?q?ClientAddress=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/net/client/Client.java | 23 ++++++++++ .../org/redkale/net/client/ClientAddress.java | 44 ++++--------------- .../org/redkale/net/client/WeightAddress.java | 36 +++++++++++++++ 3 files changed, 67 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/redkale/net/client/Client.java b/src/main/java/org/redkale/net/client/Client.java index 6951e3edc..8b8044e78 100644 --- a/src/main/java/org/redkale/net/client/Client.java +++ b/src/main/java/org/redkale/net/client/Client.java @@ -170,6 +170,29 @@ public abstract class Client, R extends ClientR return null; } + //更新地址列表 + protected void updateClientAddress(List addrs) { + Set newAddrs = new HashSet<>(addrs); + Set delAddrs = new HashSet<>(); + for (SocketAddress addr : this.address.getAddresses()) { + if (!newAddrs.contains(addr)) { + delAddrs.add(addr); + } + } + this.address.updateAddress(addrs); + + for (SocketAddress addr : delAddrs) { + AddressConnEntry[] entrys = this.connAddrEntrys.remove(addr); + if (entrys != null) { + for (AddressConnEntry entry : entrys) { + if (entry != null && entry.connection != null) { + entry.connection.dispose(null); + } + } + } + } + } + protected int pingIntervalSeconds() { return 30; } diff --git a/src/main/java/org/redkale/net/client/ClientAddress.java b/src/main/java/org/redkale/net/client/ClientAddress.java index c6de32d3c..a7abd7ba8 100644 --- a/src/main/java/org/redkale/net/client/ClientAddress.java +++ b/src/main/java/org/redkale/net/client/ClientAddress.java @@ -38,14 +38,17 @@ public class ClientAddress implements java.io.Serializable { if (addrs == null || addrs.isEmpty()) { throw new NullPointerException("addresses is empty"); } - this.addresses = createAddressArray(addrs); + this.addresses = WeightAddress.createAddressArray(addrs); } - public void updateAddress(List addrs) { + void updateAddress(List addrs) { if (addrs == null || addrs.isEmpty()) { throw new NullPointerException("addresses is empty"); } - this.addresses = createAddressArray(addrs); + for (SocketAddress addr : addrs) { + Objects.requireNonNull(addr); + } + this.addresses = addrs.toArray(new SocketAddress[addrs.size()]); } public SocketAddress randomAddress() { @@ -56,39 +59,8 @@ public class ClientAddress implements java.io.Serializable { return addrs[ThreadLocalRandom.current().nextInt(addrs.length)]; } - private static SocketAddress[] createAddressArray(List ws) { - int min = 0; - int size = 0; //20,35,45去掉最大公约数,数组长度为:4+7+9=20 - for (WeightAddress w : ws) { - size += w.getWeight(); - if (min == 0 || w.getWeight() < min) { - min = w.getWeight(); - } - } - int divisor = 1; //最大公约数 - for (int i = 2; i <= min; i++) { - boolean all = true; - for (WeightAddress w : ws) { - if (w.getWeight() % i > 0) { - all = false; - break; - } - } - if (all) { - divisor = i; - } - } - size /= divisor; - SocketAddress[] newAddrs = new SocketAddress[size]; - int index = -1; - for (int i = 0; i < ws.size(); i++) { - WeightAddress w = ws.get(i); - int z = w.getWeight() / divisor; - for (int j = 0; j < z; j++) { - newAddrs[++index] = w.getAddress(); - } - } - return newAddrs; + public Set getAddresses() { + return Set.of(addresses); } @Override diff --git a/src/main/java/org/redkale/net/client/WeightAddress.java b/src/main/java/org/redkale/net/client/WeightAddress.java index aef531418..78b204ede 100644 --- a/src/main/java/org/redkale/net/client/WeightAddress.java +++ b/src/main/java/org/redkale/net/client/WeightAddress.java @@ -4,6 +4,7 @@ package org.redkale.net.client; import java.net.SocketAddress; +import java.util.List; import java.util.Objects; import org.redkale.annotation.ConstructorParameters; import org.redkale.convert.ConvertColumn; @@ -38,6 +39,41 @@ public class WeightAddress implements Comparable, java.io.Seriali this.weight = weight; } + public static SocketAddress[] createAddressArray(List ws) { + int min = 0; + int size = 0; //20,35,45去掉最大公约数,数组长度为:4+7+9=20 + for (WeightAddress w : ws) { + size += w.getWeight(); + if (min == 0 || w.getWeight() < min) { + min = w.getWeight(); + } + } + int divisor = 1; //最大公约数 + for (int i = 2; i <= min; i++) { + boolean all = true; + for (WeightAddress w : ws) { + if (w.getWeight() % i > 0) { + all = false; + break; + } + } + if (all) { + divisor = i; + } + } + size /= divisor; + SocketAddress[] newAddrs = new SocketAddress[size]; + int index = -1; + for (int i = 0; i < ws.size(); i++) { + WeightAddress w = ws.get(i); + int z = w.getWeight() / divisor; + for (int j = 0; j < z; j++) { + newAddrs[++index] = w.getAddress(); + } + } + return newAddrs; + } + @Override public int compareTo(WeightAddress o) { return this.weight - (o == null ? 0 : o.weight);