Merge pull request #400 from micro/interval
Move RegisterInterval into the server
This commit is contained in:
		| @@ -27,6 +27,8 @@ type Options struct { | ||||
|  | ||||
| 	// The register expiry time | ||||
| 	RegisterTTL time.Duration | ||||
| 	// The interval on which to register | ||||
| 	RegisterInterval time.Duration | ||||
|  | ||||
| 	// The router for requests | ||||
| 	Router Router | ||||
| @@ -168,6 +170,13 @@ func RegisterTTL(t time.Duration) Option { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Register the service with at interval | ||||
| func RegisterInterval(t time.Duration) Option { | ||||
| 	return func(o *Options) { | ||||
| 		o.RegisterInterval = t | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithRouter sets the request router | ||||
| func WithRouter(r Router) Option { | ||||
| 	return func(o *Options) { | ||||
|   | ||||
| @@ -439,6 +439,7 @@ func (s *rpcServer) Start() error { | ||||
| 	registerDebugHandler(s) | ||||
| 	config := s.Options() | ||||
|  | ||||
| 	// start listening on the transport | ||||
| 	ts, err := config.Transport.Listen(config.Address) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @@ -446,30 +447,45 @@ func (s *rpcServer) Start() error { | ||||
|  | ||||
| 	log.Logf("Transport [%s] Listening on %s", config.Transport.String(), ts.Addr()) | ||||
|  | ||||
| 	s.Lock() | ||||
| 	// swap address | ||||
| 	s.Lock() | ||||
| 	addr := s.opts.Address | ||||
| 	s.opts.Address = ts.Addr() | ||||
| 	s.Unlock() | ||||
|  | ||||
| 	exit := make(chan bool, 1) | ||||
| 	// connect to the broker | ||||
| 	if err := config.Broker.Connect(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Logf("Broker [%s] Listening on %s", config.Broker.String(), config.Broker.Address()) | ||||
|  | ||||
| 	// announce self to the world | ||||
| 	if err := s.Register(); err != nil { | ||||
| 		log.Log("Server register error: ", err) | ||||
| 	} | ||||
|  | ||||
| 	exit := make(chan bool) | ||||
|  | ||||
| 	go func() { | ||||
| 		for { | ||||
| 			// listen for connections | ||||
| 			err := ts.Accept(s.ServeConn) | ||||
|  | ||||
| 			// check if we're supposed to exit | ||||
| 			// TODO: listen for messages | ||||
| 			// msg := broker.Exchange(service).Consume() | ||||
|  | ||||
| 			select { | ||||
| 			// check if we're supposed to exit | ||||
| 			case <-exit: | ||||
| 				return | ||||
| 			default: | ||||
| 			} | ||||
|  | ||||
| 			// check the error and backoff | ||||
| 			if err != nil { | ||||
| 				log.Logf("Accept error: %v", err) | ||||
| 				time.Sleep(time.Second) | ||||
| 				continue | ||||
| 			default: | ||||
| 				if err != nil { | ||||
| 					log.Logf("Accept error: %v", err) | ||||
| 					time.Sleep(time.Second) | ||||
| 					continue | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// no error just exit | ||||
| @@ -478,9 +494,38 @@ func (s *rpcServer) Start() error { | ||||
| 	}() | ||||
|  | ||||
| 	go func() { | ||||
| 		// wait for exit | ||||
| 		ch := <-s.exit | ||||
| 		exit <- true | ||||
|  | ||||
| 		// new ticker | ||||
| 		t := time.NewTicker(s.opts.RegisterInterval) | ||||
|  | ||||
| 		// only process if it exists | ||||
| 		if s.opts.RegisterInterval <= time.Duration(0) { | ||||
| 			t.C = nil | ||||
| 		} | ||||
|  | ||||
| 		// return error chan | ||||
| 		var ch chan error | ||||
|  | ||||
| 	Loop: | ||||
| 		for { | ||||
| 			select { | ||||
| 			// register self on interval | ||||
| 			case <-t.C: | ||||
| 				if err := s.Register(); err != nil { | ||||
| 					log.Log("Server register error: ", err) | ||||
| 				} | ||||
| 			// wait for exit | ||||
| 			case ch = <-s.exit: | ||||
| 				t.Stop() | ||||
| 				close(exit) | ||||
| 				break Loop | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// deregister self | ||||
| 		if err := s.Deregister(); err != nil { | ||||
| 			log.Log("Server deregister error: ", err) | ||||
| 		} | ||||
|  | ||||
| 		// wait for requests to finish | ||||
| 		if wait(s.opts.Context) { | ||||
| @@ -493,18 +538,12 @@ func (s *rpcServer) Start() error { | ||||
| 		// disconnect the broker | ||||
| 		config.Broker.Disconnect() | ||||
|  | ||||
| 		s.Lock() | ||||
| 		// swap back address | ||||
| 		s.Lock() | ||||
| 		s.opts.Address = addr | ||||
| 		s.Unlock() | ||||
| 	}() | ||||
|  | ||||
| 	// TODO: subscribe to cruft | ||||
| 	if err := config.Broker.Connect(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Logf("Broker [%s] Listening on %s", config.Broker.String(), config.Broker.Address()) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -21,8 +21,6 @@ type Server interface { | ||||
| 	NewHandler(interface{}, ...HandlerOption) Handler | ||||
| 	NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber | ||||
| 	Subscribe(Subscriber) error | ||||
| 	Register() error | ||||
| 	Deregister() error | ||||
| 	Start() error | ||||
| 	Stop() error | ||||
| 	String() string | ||||
| @@ -173,16 +171,6 @@ func Subscribe(s Subscriber) error { | ||||
| 	return DefaultServer.Subscribe(s) | ||||
| } | ||||
|  | ||||
| // Register registers the default server with the discovery system | ||||
| func Register() error { | ||||
| 	return DefaultServer.Register() | ||||
| } | ||||
|  | ||||
| // Deregister deregisters the default server from the discovery system | ||||
| func Deregister() error { | ||||
| 	return DefaultServer.Deregister() | ||||
| } | ||||
|  | ||||
| // Run starts the default server and waits for a kill | ||||
| // signal before exiting. Also registers/deregisters the server | ||||
| func Run() error { | ||||
| @@ -190,18 +178,10 @@ func Run() error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := DefaultServer.Register(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	ch := make(chan os.Signal, 1) | ||||
| 	signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) | ||||
| 	log.Logf("Received signal %s", <-ch) | ||||
|  | ||||
| 	if err := DefaultServer.Deregister(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return Stop() | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user