Class: RubySkynet::Server
- Inherits:
-
Object
- Object
- RubySkynet::Server
- Includes:
- SemanticLogger::Loggable
- Defined in:
- lib/ruby_skynet/server.rb
Instance Attribute Summary collapse
-
#hostname ⇒ Object
readonly
The actual port the server is running at.
-
#port ⇒ Object
readonly
The actual port the server is running at.
-
#services ⇒ Object
readonly
The actual port the server is running at.
Instance Method Summary collapse
- #close ⇒ Object
-
#deregister_service(klass) ⇒ Object
De-register service from this server.
-
#initialize(start_port = nil, ip_address = nil) ⇒ Server
constructor
Start the server so that it can start taking RPC calls Returns false if the server is already running.
-
#register_service(klass) ⇒ Object
Registers a Service Class as being available at this server.
-
#register_services_in_path(path = RubySkynet.services_path) ⇒ Object
Loads and registers all services found in the supplied path and it’s sub-directories Returns [RubySkynet::Service] the list of Services registered.
-
#running? ⇒ Boolean
Returns whether the server is running.
-
#wait_until_server_stops ⇒ Object
Wait forever until the running server stops.
Constructor Details
#initialize(start_port = nil, ip_address = nil) ⇒ Server
Start the server so that it can start taking RPC calls Returns false if the server is already running
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/ruby_skynet/server.rb', line 17 def initialize(start_port = nil, ip_address = nil) ip_address ||= RubySkynet.local_ip_address start_port = (start_port || RubySkynet.server_port).to_i raise InvalidConfigurationException.new("Invalid Starting Port number: #{start_port}") unless start_port > 0 # If port is in use, try the next port in sequence port_count = 0 begin @server = ::TCPServer.new(ip_address, start_port + port_count) @hostname = ip_address @port = start_port + port_count rescue Errno::EADDRINUSE => exc if port_count < 999 port_count += 1 retry end raise exc end # Start Server listener thread @listener_thread = Thread.new { run } # Array[RubySkynet::Service] List of services registered with this server instance @services = ThreadSafe::Hash.new end |
Instance Attribute Details
#hostname ⇒ Object (readonly)
The actual port the server is running at
13 14 15 |
# File 'lib/ruby_skynet/server.rb', line 13 def hostname @hostname end |
#port ⇒ Object (readonly)
The actual port the server is running at
13 14 15 |
# File 'lib/ruby_skynet/server.rb', line 13 def port @port end |
#services ⇒ Object (readonly)
The actual port the server is running at
13 14 15 |
# File 'lib/ruby_skynet/server.rb', line 13 def services @services end |
Instance Method Details
#close ⇒ Object
43 44 45 46 47 48 49 50 51 52 |
# File 'lib/ruby_skynet/server.rb', line 43 def close @server.close if @server logger.info "Skynet Server Stopped" # Deregister services hosted by this server @services.each_value do |klass| deregister_service(klass) rescue nil end logger.info "Skynet Services De-registered" end |
#deregister_service(klass) ⇒ Object
De-register service from this server
79 80 81 82 83 84 85 |
# File 'lib/ruby_skynet/server.rb', line 79 def deregister_service(klass) raise InvalidServiceException.new("#{klass.inspect} is not a RubySkynet::Service") unless klass.respond_to?(:skynet_name) && klass.respond_to?(:skynet_version) && klass.respond_to?(:skynet_region) logger.info "De-registering Service: #{klass.name} with name: #{klass.skynet_name}" ::RubySkynet.service_registry.deregister_service(klass.skynet_name, klass.skynet_version || 1, klass.skynet_region, @hostname, @port) @services.delete(klass.skynet_name) end |
#register_service(klass) ⇒ Object
Registers a Service Class as being available at this server
65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/ruby_skynet/server.rb', line 65 def register_service(klass) raise InvalidServiceException.new("#{klass.inspect} is not a RubySkynet::Service") unless klass.respond_to?(:skynet_name) && klass.respond_to?(:skynet_version) && klass.respond_to?(:skynet_region) previous_klass = @services[klass.skynet_name] if previous_klass && (previous_klass.name != klass.name) logger.warn("Service with name: #{klass.skynet_name} is already registered to a different implementation:#{previous_klass.name}") end @services[klass.skynet_name] = klass logger.info "Registering Service: #{klass.name} with name: #{klass.skynet_name}" ::RubySkynet.service_registry.register_service(klass.skynet_name, klass.skynet_version || 1, klass.skynet_region, @hostname, @port) end |
#register_services_in_path(path = RubySkynet.services_path) ⇒ Object
Loads and registers all services found in the supplied path and it’s sub-directories Returns [RubySkynet::Service] the list of Services registered
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/ruby_skynet/server.rb', line 89 def register_services_in_path(path=RubySkynet.services_path) logger.benchmark_info "Loaded Skynet Services" do # Load services klasses = [] Dir.glob("#{path}/**/*.rb").each do |filename| partial = filename.sub(path,'').sub('.rb', '') load filename camelized = partial.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } begin klass = constantize(camelized) # Register the service register_service(klass) klasses << klass rescue Exception => exc p exc raise "Expected to find class #{camelized} in file #{filename}" end end klasses end end |
#running? ⇒ Boolean
Returns whether the server is running
55 56 57 |
# File 'lib/ruby_skynet/server.rb', line 55 def running? (@server != nil) && !@server.closed? end |
#wait_until_server_stops ⇒ Object
Wait forever until the running server stops
60 61 62 |
# File 'lib/ruby_skynet/server.rb', line 60 def wait_until_server_stops @listener_thread.join end |