diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboRestMetadataRegistrationAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboRestMetadataRegistrationAutoConfiguration.java index 745680e0c..242354b4d 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboRestMetadataRegistrationAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboRestMetadataRegistrationAutoConfiguration.java @@ -29,12 +29,14 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.event.ApplicationFailedEvent; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.cloud.alibaba.dubbo.metadata.resolver.MetadataResolver; import org.springframework.cloud.alibaba.dubbo.service.DubboMetadataConfigService; import org.springframework.cloud.alibaba.dubbo.service.PublishingDubboMetadataConfigService; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.annotation.Configuration; +import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.event.EventListener; import org.springframework.util.StringUtils; @@ -73,6 +75,11 @@ public class DubboRestMetadataRegistrationAutoConfiguration { @Value("${spring.application.name:application}") private String currentApplicationName; + /** + * The ServiceConfig of DubboMetadataConfigService to be exported, can be nullable. + */ + private ServiceConfig serviceConfig; + @EventListener(ServiceBeanExportedEvent.class) public void recordRestMetadata(ServiceBeanExportedEvent event) { ServiceBean serviceBean = event.getServiceBean(); @@ -84,8 +91,22 @@ public class DubboRestMetadataRegistrationAutoConfiguration { exportDubboMetadataConfigService(); } + @EventListener(ApplicationFailedEvent.class) + public void onApplicationFailed() { + unexportDubboMetadataConfigService(); + } + + @EventListener(ContextClosedEvent.class) + public void onContextClosed() { + unexportDubboMetadataConfigService(); + } + private void exportDubboMetadataConfigService() { + if (serviceConfig != null && serviceConfig.isExported()) { + return; + } + if (StringUtils.isEmpty(dubboMetadataConfigService.getServiceRestMetadata())) { // If there is no REST metadata, DubboMetadataConfigService will not be exported. if (logger.isInfoEnabled()) { @@ -95,7 +116,7 @@ public class DubboRestMetadataRegistrationAutoConfiguration { return; } - ServiceConfig serviceConfig = new ServiceConfig<>(); + serviceConfig = new ServiceConfig<>(); serviceConfig.setInterface(DubboMetadataConfigService.class); // Use current Spring application name as the Dubbo Service version @@ -105,5 +126,22 @@ public class DubboRestMetadataRegistrationAutoConfiguration { serviceConfig.setProtocol(metadataProtocolConfig); serviceConfig.export(); + + if (logger.isInfoEnabled()) { + logger.info("The Dubbo service[{}] has been exported.", serviceConfig.toString()); + } + } + + private void unexportDubboMetadataConfigService() { + + if (serviceConfig == null || serviceConfig.isUnexported()) { + return; + } + + serviceConfig.unexport(); + + if (logger.isInfoEnabled()) { + logger.info("The Dubbo service[{}] has been unexported.", serviceConfig.toString()); + } } }