xh1202 opened a new issue, #10610:
URL: https://github.com/apache/dubbo/issues/10610

   问题描述:发现服务关停过程中未正常调用ServiceDiscovery的unregister方法
   
   问题原因:
   1. 
preDestroy中,先执行destroyRegistries(),再执行destroyServiceDiscoveries(),最后执行unregisterServiceInstance()
   ~~~
       @Override
       public void preDestroy() {
           synchronized (destroyLock) {
               if (isStopping() || isStopped()) {
                   return;
               }
               onStopping();
   
               destroyRegistries();
               destroyServiceDiscoveries();
               destroyMetadataReports();
   
               unRegisterShutdownHook();
               if (asyncMetadataFuture != null) {
                   asyncMetadataFuture.cancel(true);
               }
               unregisterServiceInstance();
           }
       }
   ~~~
   2. 
destroyRegistries()方法中调用destroyAll()方法,将容器registries中所有Registry进行销毁并从容器registries中移除,此时容器registries中已经没有数据,并且所有与注册中心的通信工具(如nacos的NamingService,zk的CuratorFramework)都被销毁
   ~~~
      public void destroyAll() {
           if (!destroyed.compareAndSet(false, true)) {
               return;
           }
   
           if (LOGGER.isInfoEnabled()) {
               LOGGER.info("Close all registries " + getRegistries());
           }
           // Lock up the registry shutdown process
           lock.lock();
           try {
               for (Registry registry : getRegistries()) {
                   try {
                       registry.destroy();
                   } catch (Throwable e) {
                       LOGGER.warn(e.getMessage(), e);
                   }
               }
               registries.clear();
           } finally {
               // Release the lock
               lock.unlock();
           }
       }
   ~~~
   3. 
destroyServiceDiscoveries()、unregisterServiceInstance()执行时,已经无法从容器registries中获取ServiceDiscoveries(即使能获取到,与注册中心的通信工具NamingService\CuratorFramework等已经被销毁无法使用)
   
   
修改方法:将unregisterServiceInstance()调整到destroyRegistries()之前,并删除destroyServiceDiscoveries()
   ~~~
      @Override
       public void preDestroy() {
           synchronized (destroyLock) {
               if (isStopping() || isStopped()) {
                   return;
               }
               onStopping();
               
               unregisterServiceInstance();
               destroyRegistries();
               destroyMetadataReports();
   
               unRegisterShutdownHook();
               if (asyncMetadataFuture != null) {
                   asyncMetadataFuture.cancel(true);
               }
   
           }
       }
   ~~~
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to