diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/ConnectionBasedClientManager.java b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/ConnectionBasedClientManager.java index e7888fb8237..05cd8f468f5 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/ConnectionBasedClientManager.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/ConnectionBasedClientManager.java @@ -30,6 +30,7 @@ import com.alibaba.nacos.naming.core.v2.client.impl.ConnectionBasedClient; import com.alibaba.nacos.naming.core.v2.client.manager.ClientManager; import com.alibaba.nacos.naming.core.v2.event.client.ClientEvent; +import com.alibaba.nacos.naming.core.v2.event.client.ClientOperationEvent; import com.alibaba.nacos.naming.misc.GlobalExecutor; import com.alibaba.nacos.naming.misc.Loggers; import org.springframework.stereotype.Component; @@ -102,7 +103,9 @@ public boolean clientDisconnected(String clientId) { return true; } client.release(); - NotifyCenter.publishEvent(new ClientEvent.ClientDisconnectEvent(client, isResponsibleClient(client))); + boolean isResponsible = isResponsibleClient(client); + NotifyCenter.publishEvent(new ClientOperationEvent.ClientReleaseEvent(client, isResponsible)); + NotifyCenter.publishEvent(new ClientEvent.ClientDisconnectEvent(client, isResponsible)); return true; } diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/EphemeralIpPortClientManager.java b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/EphemeralIpPortClientManager.java index 64a750ec8f5..887fbdf4431 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/EphemeralIpPortClientManager.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/EphemeralIpPortClientManager.java @@ -28,6 +28,7 @@ import com.alibaba.nacos.naming.core.v2.client.impl.IpPortBasedClient; import com.alibaba.nacos.naming.core.v2.client.manager.ClientManager; import com.alibaba.nacos.naming.core.v2.event.client.ClientEvent; +import com.alibaba.nacos.naming.core.v2.event.client.ClientOperationEvent; import com.alibaba.nacos.naming.healthcheck.heartbeat.ClientBeatUpdateTask; import com.alibaba.nacos.naming.misc.ClientConfig; import com.alibaba.nacos.naming.misc.GlobalExecutor; @@ -92,8 +93,10 @@ public boolean clientDisconnected(String clientId) { if (null == client) { return true; } - NotifyCenter.publishEvent(new ClientEvent.ClientDisconnectEvent(client, isResponsibleClient(client))); + boolean isResponsible = isResponsibleClient(client); + NotifyCenter.publishEvent(new ClientEvent.ClientDisconnectEvent(client, isResponsible)); client.release(); + NotifyCenter.publishEvent(new ClientOperationEvent.ClientReleaseEvent(client, isResponsible)); return true; } diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/PersistentIpPortClientManager.java b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/PersistentIpPortClientManager.java index b062d9b7c19..df46ec39968 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/PersistentIpPortClientManager.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/client/manager/impl/PersistentIpPortClientManager.java @@ -26,6 +26,7 @@ import com.alibaba.nacos.naming.core.v2.client.impl.IpPortBasedClient; import com.alibaba.nacos.naming.core.v2.client.manager.ClientManager; import com.alibaba.nacos.naming.core.v2.event.client.ClientEvent; +import com.alibaba.nacos.naming.core.v2.event.client.ClientOperationEvent; import com.alibaba.nacos.naming.misc.Loggers; import org.springframework.stereotype.Component; @@ -81,8 +82,10 @@ public boolean clientDisconnected(String clientId) { if (null == client) { return true; } - NotifyCenter.publishEvent(new ClientEvent.ClientDisconnectEvent(client, isResponsibleClient(client))); + boolean isResponsible = isResponsibleClient(client); + NotifyCenter.publishEvent(new ClientEvent.ClientDisconnectEvent(client, isResponsible)); client.release(); + NotifyCenter.publishEvent(new ClientOperationEvent.ClientReleaseEvent(client, isResponsible)); return true; } diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/event/client/ClientOperationEvent.java b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/event/client/ClientOperationEvent.java index 1293fb8745c..93ecd25cdea 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/event/client/ClientOperationEvent.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/event/client/ClientOperationEvent.java @@ -17,6 +17,7 @@ package com.alibaba.nacos.naming.core.v2.event.client; import com.alibaba.nacos.common.notify.Event; +import com.alibaba.nacos.naming.core.v2.client.Client; import com.alibaba.nacos.naming.core.v2.pojo.Service; /** @@ -92,4 +93,27 @@ public ClientUnsubscribeServiceEvent(Service service, String clientId) { super(clientId, service); } } + + public static class ClientReleaseEvent extends ClientOperationEvent { + + private static final long serialVersionUID = -281486927726245701L; + + private final Client client; + + private final boolean isNative; + + public ClientReleaseEvent(Client client, boolean isNative) { + super(client.getClientId(), null); + this.client = client; + this.isNative = isNative; + } + + public Client getClient() { + return client; + } + + public boolean isNative() { + return isNative; + } + } } diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManager.java b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManager.java index 56eb553b404..d80824f59e6 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManager.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManager.java @@ -23,7 +23,6 @@ import com.alibaba.nacos.common.trace.event.naming.DeregisterInstanceTraceEvent; import com.alibaba.nacos.common.utils.ConcurrentHashSet; import com.alibaba.nacos.naming.core.v2.client.Client; -import com.alibaba.nacos.naming.core.v2.event.client.ClientEvent; import com.alibaba.nacos.naming.core.v2.event.client.ClientOperationEvent; import com.alibaba.nacos.naming.core.v2.event.publisher.NamingEventPublisherFactory; import com.alibaba.nacos.naming.core.v2.event.service.ServiceEvent; @@ -84,20 +83,20 @@ public List> subscribeTypes() { result.add(ClientOperationEvent.ClientDeregisterServiceEvent.class); result.add(ClientOperationEvent.ClientSubscribeServiceEvent.class); result.add(ClientOperationEvent.ClientUnsubscribeServiceEvent.class); - result.add(ClientEvent.ClientDisconnectEvent.class); + result.add(ClientOperationEvent.ClientReleaseEvent.class); return result; } @Override public void onEvent(Event event) { - if (event instanceof ClientEvent.ClientDisconnectEvent) { - handleClientDisconnect((ClientEvent.ClientDisconnectEvent) event); + if (event instanceof ClientOperationEvent.ClientReleaseEvent) { + handleClientDisconnect((ClientOperationEvent.ClientReleaseEvent) event); } else if (event instanceof ClientOperationEvent) { handleClientOperation((ClientOperationEvent) event); } } - private void handleClientDisconnect(ClientEvent.ClientDisconnectEvent event) { + private void handleClientDisconnect(ClientOperationEvent.ClientReleaseEvent event) { Client client = event.getClient(); for (Service each : client.getAllSubscribeService()) { removeSubscriberIndexes(each, client.getClientId()); diff --git a/naming/src/test/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManagerTest.java b/naming/src/test/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManagerTest.java index 890abf7cf4c..0aa980ba64f 100644 --- a/naming/src/test/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManagerTest.java +++ b/naming/src/test/java/com/alibaba/nacos/naming/core/v2/index/ClientServiceIndexesManagerTest.java @@ -18,7 +18,6 @@ import com.alibaba.nacos.common.notify.Event; import com.alibaba.nacos.naming.core.v2.client.Client; -import com.alibaba.nacos.naming.core.v2.event.client.ClientEvent; import com.alibaba.nacos.naming.core.v2.event.client.ClientOperationEvent; import com.alibaba.nacos.naming.core.v2.pojo.Service; import org.junit.Assert; @@ -46,7 +45,7 @@ public class ClientServiceIndexesManagerTest { private Service service; @Mock - private ClientEvent.ClientDisconnectEvent clientDisconnectEvent; + private ClientOperationEvent.ClientReleaseEvent clientReleaseEvent; @Mock private ClientOperationEvent clientOperationEvent; @@ -126,10 +125,10 @@ public void testSubscribeTypes() { @Test public void testOnEvent() { - Mockito.when(clientDisconnectEvent.getClient()).thenReturn(client); - clientServiceIndexesManager.onEvent(clientDisconnectEvent); + Mockito.when(clientReleaseEvent.getClient()).thenReturn(client); + clientServiceIndexesManager.onEvent(clientReleaseEvent); - Mockito.verify(clientDisconnectEvent).getClient(); + Mockito.verify(clientReleaseEvent).getClient(); clientServiceIndexesManager.onEvent(clientOperationEvent);