class TickrClient
Attributes
cache_size[RW]
next_server_index[RW]
query_in_progress[RW]
replenish_cache_at[RW]
servers[RW]
tickets[RW]
timeout[RW]
Public Class Methods
new(opts)
click to toggle source
# File lib/tickr_client.rb, line 9 def initialize(opts) self.servers = opts[:servers] self.timeout = opts[:timeout] || 1000 self.cache_size = opts[:cache_size] || 100 self.replenish_cache_at = opts[:replenish_cache_at] || 10 self.query_in_progress = false self.next_server_index = Random.new.rand(servers.count) self.tickets = ThreadSafe::Array.new fetch_tickets end
Public Instance Methods
get_ticket()
click to toggle source
# File lib/tickr_client.rb, line 22 def get_ticket fetch_tickets if tickets.count == 0 this_ticket = tickets.shift fetch_tickets_async if tickets.count <= replenish_cache_at this_ticket end
Protected Instance Methods
create_tickets_from_ticket_group(group)
click to toggle source
Create an array of tickets based on a 'ticket group' array of size 3:
-
First element of ticket group is the first ticket.
-
Second element of ticket group is the increment between consecutive tickets.
-
Third element of ticket group is the number of tickets to create.
# File lib/tickr_client.rb, line 78 def create_tickets_from_ticket_group(group) initial_ticket, diff, num_of_tickets = group['first'], group['increment'], group['count'] new_tickets = [initial_ticket] (num_of_tickets - 1).times do new_tickets << new_tickets.last + diff end new_tickets end
fetch_tickets()
click to toggle source
# File lib/tickr_client.rb, line 33 def fetch_tickets # Try every server up to three times. while !fetch_tickets_from_server(next_server_index) do self.next_server_index = (self.next_server_index + 1) % servers.count end end
fetch_tickets_async()
click to toggle source
# File lib/tickr_client.rb, line 61 def fetch_tickets_async return if self.query_in_progress self.query_in_progress = true Thread.new do fetch_tickets self.query_in_progress = false end end
fetch_tickets_from_server(index)
click to toggle source
# File lib/tickr_client.rb, line 40 def fetch_tickets_from_server(index) new_ticket_group = begin uri = URI.parse("http://#{servers[index][:host]}:#{servers[index][:port]}/tickets/create/#{replenish_capacity}") request = Net::HTTP::Get.new(uri.request_uri) if servers[index][:http_auth_password] && servers[index][:http_auth_password] != '' request.basic_auth '', servers[index][:http_auth_password] end response = Timeout::timeout(timeout / 1000.0) do Net::HTTP.new(uri.host, uri.port).start{|http| http.request(request)} end JSON.parse(response.body) rescue Timeout::Error return false end new_tickets = create_tickets_from_ticket_group(new_ticket_group) tickets.concat(new_tickets) true end
replenish_capacity()
click to toggle source
# File lib/tickr_client.rb, line 70 def replenish_capacity cache_size - tickets.count end