Class: Majordomo::Client
- Inherits:
-
Object
- Object
- Majordomo::Client
- Defined in:
- lib/majordomo/client.rb
Instance Method Summary collapse
-
#initialize(broker, verbose = false) ⇒ Client
constructor
A new instance of Client.
-
#send_and_receive(service, request) ⇒ Object
Send request to broker and get reply by hook or crook.
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 |