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



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

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



17
18
19
# File 'lib/akephalos/remote_client.rb', line 17

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

.start!Object

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



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

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 {
    if RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
      system("taskkill /PID #{remote_client.pid} /F /T")
    else
      Process.kill(:INT, remote_client.pid)
    end
  }

  port
end