DrbとCelluloid

こんなコントローラがあったとします。 コレは、druby://localhost:8787へ接続して、 receiverに対してメソッドを実行します。

# coding: utf-8

require 'drb/drb'
require 'trema'

# Simple Tap Controller.
class Tap < Trema::Controller
  attr_accessor :switches

  def start
    info 'starting tap controller'
    @switches = []
    @receiver = rpc_server
  end

  def switch_ready(datapath_id)
    info "connected: #{ datapath_id.to_hex }"
    @receiver.mailbox << datapath_id.to_hex
    send_message datapath_id, FeaturesRequest.new
  end

  def features_reply(datapath_id, features_reply)
    info "features_reply from: #{ datapath_id.to_hex }"
    @switches.push datapath_id.to_hex
  end

  private

  def rpc_server
    uri = "druby://localhost:8787"
    DRb.start_service
    DRbObject.new_with_uri(uri)
  end
end

下記がreceiverの実装です。 druby://localhost:8787で待ち受けています。 このコードを実行すると、mailboxに対して何かが入ったら、 receive loopの中を実行することができます。

require 'drb/drb'
require 'celluloid'

URI="druby://localhost:8787"

# Message Receiver.
class Receiver
  include Celluloid

  def initialize
    async.wait
  end

  def wait
    loop do
      message = receive{|msg| msg.is_a? String }
      puts "received: #{ message }"
    end
  end
end

DRb.start_service(URI, Receiver.new, :safe_level => 1)
DRb.thread.join

今日はネットワーク越しのcelluloidを簡単にやってみました。