Class: Majordomo::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/majordomo/client.rb

Instance Method Summary collapse

Constructor Details

#initialize(broker, verbose = false) ⇒ Client

Returns a new instance of Client.



14
15
16
17
18
19
20
21
22
# File 'lib/majordomo/client.rb', line 14

def initialize(broker, verbose=false)
  @broker = broker
  @verbose = verbose
  @ctx = ZMQ::Context.new
  @poller = ZMQ::Poller.new
  @retries = 3
  @timeout = 2500
  reconnect_to_broker
end

Instance Method Details

#send_and_receive(service, request) ⇒ Object

Send request to broker and get reply by hook or crook. Takes ownership of request message and destroys it when sent. Returns the reply message or None if there was no reply.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
# File 'lib/majordomo/client.rb', line 27

def send_and_receive  service, request
  request = [Majordomo::C_CLIENT, service, request]
  log "I: send request to '#{service}' service: #{request}"
  reply = nil
  retries = @retries
  while retries > 0
    @client.send_strings(request)
    begin
      items = @poller.poll(@timeout)
    rescue => e
      items = 0
      break # interrupted
    end

    if items == -1
      warn "Poller error: Error number #{ZMQ::Util.errno}"
    elsif items > 0
      msg = []
      @client.recv_strings(msg)
      log "I: received reply: #{msg}"

      # Don't try to handle errors, just assert noisily
      raise "expected at least three parts" unless msg.length >= 3
      header, reply_service, *rest = *msg
      raise "bad header #{header}" unless Majordomo::C_CLIENT == header
      raise "bad service #{reply_service}" unless service == reply_service

      reply = rest
      break
    else
      if retries
        warn "W: no reply, reconnecting…"
        reconnect_to_broker
      else
        warn "W: permanent error, abandoning"
        break
      end
      retries -= 1
    end
  end
  return reply
end