Class: RubySkynet::Server

Inherits:
Object
  • Object
show all
Includes:
SemanticLogger::Loggable
Defined in:
lib/ruby_skynet/server.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#hostnameObject (readonly)

The actual port the server is running at



13
14
15
# File 'lib/ruby_skynet/server.rb', line 13

def hostname
  @hostname
end

#portObject (readonly)

The actual port the server is running at



13
14
15
# File 'lib/ruby_skynet/server.rb', line 13

def port
  @port
end

#servicesObject (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

#closeObject



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

Returns:

  • (Boolean)


55
56
57
# File 'lib/ruby_skynet/server.rb', line 55

def running?
  (@server != nil) && !@server.closed?
end

#wait_until_server_stopsObject

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