Sha256: 56cab1dfd908bf548b61e9db39b782695cd5fdf93610a85b7895966c8af4319c

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

require 'rinda/rinda' 
require 'rubyonacid/factory'

module RubyOnAcid

#Allows values to be sent over the network.  For more information, see the Ruby standard library documentation for Rinda.
class RindaFactory < Factory
  
  #Time in seconds to wait for a value before giving up and returning a default value for the given key.
  #Default is 0, which will return immediately.
  attr_accessor :timeout
  #The URI to connect to.  Default is "druby://127.0.0.1:7632" (7632 == RNDA).
  attr_accessor :uri
  
  #Takes a hash with all keys supported by Factory, plus these keys and defaults:
  #  :uri => "druby://127.0.0.1:7632"
  #  :timeout => 0
  def initialize(options = {})
    super
    @uri = options[:uri] || "druby://127.0.0.1:7632"
    @timeout = options[:timeout] || 0
    @prior_values = {}
  end
  
  #Create the Rinda TupleSpace for clients to write to.
  def start_service
    DRb.start_service 
    @space = Rinda::TupleSpaceProxy.new(DRbObject.new(nil, @uri))
  end
  
  #Get key from Rinda server.
  def get_unit(key)
    @prior_values[key] ||= 0.0
    begin
      key, value = @space.take([key, Float], @timeout)
      @prior_values[key] = value
    rescue Rinda::RequestExpiredError => exception
      if source_factories.empty?
        value = @prior_values[key]
      else
        value = super
      end
    end
    value
  end

end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rubyonacid-0.4.0 lib/rubyonacid/factories/rinda.rb