Class: Akephalos::RemoteClient

Inherits:
Object
  • Object
show all
Defined in:
lib/akephalos/remote_client.rb

Overview

The RemoteClient class provides an interface to an Akephalos::Client isntance on a remote DRb server.

Usage

client = Akephalos::RemoteClient.new
client.visit "http://www.oinopa.com"
client.page.source # => "<!DOCTYPE html PUBLIC..."

Class Method Summary collapse

Class Method Details

.managerDRbObject

Starts a remove JRuby DRb server unless already running and returns an instance of Akephalos::ClientManager.

Returns:

  • (DRbObject)

    an instance of Akephalos::ClientManager



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/akephalos/remote_client.rb', line 28

def self.manager
  return @manager if defined?(@manager)

  server_port = start!

  DRb.start_service("druby://127.0.0.1:#{find_available_port}")
  manager = DRbObject.new_with_uri("druby://127.0.0.1:#{server_port}")

  # We want to share our local configuration with the remote server
  # process, so we share an undumped version of our configuration. This
  # lets us continue to make changes locally and have them reflected in the
  # remote process.
  manager.configuration = Akephalos.configuration.extend(DRbUndumped)

  @manager = manager
end

.new(options = {}) ⇒ DRbObject

Returns a new instance of Akephalos::Client from the DRb server.

Returns:

  • (DRbObject)

    a new instance of Akephalos::Client from the DRb server



20
21
22
# File 'lib/akephalos/remote_client.rb', line 20

def self.new(options = {})
  manager.new_client(options)
end

.start!Object

Start a remote server process and return when it is available for use.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/akephalos/remote_client.rb', line 46

def self.start!
  port = find_available_port

  remote_client = IO.popen("ruby #{Akephalos::BIN_DIR + 'akephalos'} #{port}")

  # Set up a monitor thread to detect if the forked server exits
  # prematurely.
  server_monitor = Thread.new { Thread.current[:exited] = Process.wait(remote_client.pid) }

  # Wait for the server to be accessible on the socket we specified.
  until responsive?(port)
    exit!(1) if server_monitor[:exited]
    sleep 0.5
  end
  server_monitor.kill

  # Ensure that the remote server shuts down gracefully when we are
  # finished.
  at_exit { Process.kill(:INT, remote_client.pid) }

  port
end