diff --git a/registry/consul/registry.go b/registry/consul/registry.go index 869e1c1d75769447f8e3d2c0fb7817b1dc2db163..4d3718e58cd0f98b931ed525fe61f33713b6e71f 100644 --- a/registry/consul/registry.go +++ b/registry/consul/registry.go @@ -23,6 +23,7 @@ import ( ) import ( + getty "github.com/apache/dubbo-getty" consul "github.com/hashicorp/consul/api" perrors "github.com/pkg/errors" ) @@ -56,6 +57,10 @@ type consulRegistry struct { // Done field represents whether // consul registry is closed. done chan struct{} + + // registeredURLs field represents all URLs that have been registered + // will be unregistered when destroyed + registeredURLs []*common.URL } func newConsulRegistry(url *common.URL) (registry.Registry, error) { @@ -91,6 +96,7 @@ func (r *consulRegistry) Register(url *common.URL) error { // register actually register the @url func (r *consulRegistry) register(url *common.URL) error { + r.registeredURLs = append(r.registeredURLs, url.Clone()) service, err := buildService(url) if err != nil { return err @@ -188,25 +194,26 @@ func (r *consulRegistry) IsAvailable() bool { // Destroy consul registry center func (r *consulRegistry) Destroy() { - if r.URL != nil { - done := make(chan struct{}, 1) - go func() { - defer func() { - if e := recover(); e != nil { - logger.Errorf("consulRegistry destroy with panic: %v", e) - } - done <- struct{}{} - }() - if err := r.UnRegister(r.URL); err != nil { - logger.Errorf("consul registry unregister with err: %s", err.Error()) + done := make(chan struct{}, 1) + go func() { + defer func() { + if e := recover(); e != nil { + logger.Errorf("consulRegistry destroy with panic: %v", e) } + done <- struct{}{} }() - select { - case <-done: - logger.Infof("consulRegistry unregister done") - case <-time.After(registryDestroyDefaultTimeout): - logger.Errorf("consul unregister timeout") + for _, url := range r.registeredURLs { + if err := r.UnRegister(url); err != nil { + logger.Errorf("consul registry unregister with err: %s", err.Error()) + } } + }() + select { + case <-done: + logger.Infof("consulRegistry unregister done") + case <-getty.GetTimeWheel().After(registryDestroyDefaultTimeout): + logger.Errorf("consul unregister timeout") } + close(r.done) }