class Hoodoo::Services::Discovery::ByDRb::DRbServer
A registry of service endpoints, implenented as a DRB server class. An internal implementation detail of Hoodoo::Services::Middleware
, in most respects.
Public Class Methods
Create an instance ready for use as a DRb “front object”.
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 100 def initialize @repository = {} end
Start the DRb server. Does not return (joins the DRb thread). If the server is already running, expect an “address in use” connection exception from DRb.
port
-
Passed to
::uri
method.
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 63 def self.start( port = nil ) uri = self.uri( port ) # $SAFE and taint tracking is being removed from ruby 2.7+ # https://bugs.ruby-lang.org/issues/16131 # Set to 0 to disable taint tracking in earlier versions $SAFE = 0 # Have to allow a tained port string from "outside" just to be able # to start the service on a given port; so untaint that deliberately. # # http://ruby-doc.com/docs/ProgrammingRuby/html/taint.html uri.untaint() $stop_queue = ::Queue.new ::DRb.start_service( uri, FRONT_OBJECT, :tcp_acl => LOCAL_ACL ) # DRB.thread.exit() does not reliably work; sometimes, it just hangs # up. I don't know why. On OS X and under Travis, sporadic failures # to return from the "stop()" method would result. Instead, we use a # relatively elaborate queue; sit here waiting for a message to be # pushed onto it, then just let this method exit naturally, ignoring # the value that appeared on the queue. # # The sleep makes it more reliable too, indicating some kind of nasty # race condition on start-vs-wait-to-shutdown. sleep( 1 ) $stop_queue.pop() end
URI for DRb server used during local machine development as a registry of service endpoints. Whichever service starts first runs the server which others connect to if subsequently started.
port
-
Optional integer port number for DRb service. If specified, this is used; else the
HOODOO_DISCOVERY_BY_DRB_PORT_OVERRIDE
environment variable is used; else a default of 8787 is chosen. Passingnil
explicitly also leads to the use of the environment variable or default value.
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 43 def self.uri( port = nil ) port ||= ENV[ 'HOODOO_DISCOVERY_BY_DRB_PORT_OVERRIDE' ] || 8787 # Use IP address, rather than 'localhost' here, to ensure that "address # in use" errors are raised immediately if a second server startup # attempt is made: # # https://bugs.ruby-lang.org/issues/3052 # "druby://127.0.0.1:#{ port }" end
Public Instance Methods
Add an endpoint to the list. If the endpoint was already added, it will be overwritten with the new data.
resource
-
Resource as a String or Symbol, e.g. “Product”
version
-
Endpoint’s implemented API version as an Integer, e.g. 1
uri
-
URI at which this service may be accessed, including the endpoint path (e.g. “localhost:3002/v1/products”), as a String.
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 119 def add( resource, version, uri ) @repository[ "#{ resource }/#{ version }" ] = uri end
Find an endpoint in the list. Returns URI at which the service may be accessed as a String, or ‘nil’ if not found.
resource
-
Resource as a String or Symbol, e.g. “Product”
version
-
Endpoint’s implemented API version as an Integer, e.g. 1
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 129 def find( resource, version ) @repository[ "#{ resource }/#{ version }" ] end
Flush out the repository, clearing all stored service records. This is usually for test purposes only.
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 136 def flush @repository = {} end
Check to see if this DRb service is awake. Returns true
.
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 106 def ping return true end
Shut down this DRb service.
# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 142 def stop $stop_queue.push( true ) end